找回密码
 加入
搜索
楼主: afan

[系统综合] [已解决]如何判断字符串中含有ANSI编码不能保存的 Unicode 格式的字符

 火.. [复制链接]
 楼主| 发表于 2011-11-4 23:33:18 | 显示全部楼层
回复 15# happytc


    从来没去msdn看过,因为去之前是一头雾水,去了之后也就一身湿透了…
问题简单点,不需转换,只需判断含有1个以上的非ANSI编码字符就Ok~ “有/没有”
发表于 2011-11-5 00:08:06 | 显示全部楼层
本帖最后由 gzh888666 于 2011-11-5 00:27 编辑
回复  happytc


    从来没去msdn看过,因为去之前是一头雾水,去了之后也就一身湿透了…
问题简单点 ...
afan 发表于 2011-11-4 23:33
 \x00-\x7f
好像保存成UTF8就可以了,没有必要检测呀!

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2011-11-5 00:13:42 | 显示全部楼层
回复 17# gzh888666


    _ _|| 这个只是检测非那127个字符……
发表于 2011-11-5 00:38:23 | 显示全部楼层
本帖最后由 gzh888666 于 2011-11-5 00:42 编辑

回复 18# afan
BOOL IsTextUnicode(
  __in     const VOID *lpv,
  __in     int iSize,
  __inout  LPINT lpiResult
);
试试这个判断一下
微软的说明:Determines if a buffer is likely to contain a form of Unicode text.
http://msdn.microsoft.com/en-us/library/dd318672

评分

参与人数 1金钱 +22 收起 理由
afan + 22

查看全部评分

 楼主| 发表于 2011-11-5 00:48:03 | 显示全部楼层
回复 19# gzh888666


    不会用,估计也不可靠~

另外,ANSI编码可能自身都有问题,比如你新建一个记事本文档,输入“联通”,保存后关闭,再打开看看……
发表于 2011-11-5 00:54:17 | 显示全部楼层
本帖最后由 happytc 于 2011-11-5 00:56 编辑

回复 16# afan


    老大,其实‘检测’和‘转换’,其内部是一样的动作呀:都是利用得到的字符宽编码看看有没有对应的ansi编码
就是利用WideCharToMultiByte函数的最后一个参数来判断嘛!
看来还得上代码了,把下面的用utf8存为文件运行,试下两个$str

$str = 'السلام عليكم'
;$str = ChrW(AscW('a'))

Local $aResult = DllCall("kernel32.dll", "int", "WideCharToMultiByte", "uint", 0, "dword", 0, "wstr", $str, "int", -1, "ptr", 0, _
                                                "int", 0, "ptr", 0, "ptr", 0)

Local $tMultiByte = DllStructCreate("char[" & $aResult[0] & "]")
Local $pMultiByte = DllStructGetPtr($tMultiByte)
Local $tBool = DllStructCreate("BOOL")

$aResult = DllCall("kernel32.dll", "int", "WideCharToMultiByte", "uint", 0, "dword", 0, "wstr", $str, "int", -1, "ptr", $pMultiByte, _
                                        "int", $aResult[0], "ptr", 0, "ptr", DllStructGetPtr($tBool))

Local $Flag = DllStructGetData($tBool, 1)
If $Flag Then
        MsgBox(0, $Flag, "至少有一个字符不能被成功转换为相对应的多字节形式")
Else
        MsgBox(0, $Flag, "全部可以由宽字符转为ansi")
EndIf
发表于 2011-11-5 00:59:10 | 显示全部楼层
本帖最后由 happytc 于 2011-11-5 01:01 编辑

不行了,21楼的那个$Str的值,居然不能显示,反正你随便拷个简体中文的codepage里没有的字符就可以了,如前面给的阿拉伯语字符
发表于 2011-11-5 01:00:29 | 显示全部楼层

还是用UTF8格式吧!今天真的汗了!居然“联通”都不行

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2011-11-5 01:02:04 | 显示全部楼层
回复 22# happytc


    在当前的网页编码模式下只能用我一楼的方法 BinaryToString 贴出源字符
发表于 2011-11-5 01:08:43 | 显示全部楼层
用IsTextUnicode进行判断。IsTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此 IsTextUnicode有可能返回不正确的结果。

也只能这样了!别的还真没什么好的办法吧?
 楼主| 发表于 2011-11-5 01:11:17 | 显示全部楼层
回复 21# happytc


    测试了几个字符,均正确判断~!我再做更多的测试再反馈~ 感谢。
发表于 2011-11-5 01:11:51 | 显示全部楼层
回复  happytc


    在当前的网页编码模式下只能用我一楼的方法 BinaryToString 贴出源字符
afan 发表于 2011-11-5 01:02


嗯,那就用这种形式吧,还不用存au3为utf8了

#Include <WinAPI.au3>
#include <Array.au3>
$str = BinaryToString('0x00A0', 3)
;$str = ChrW(AscW('a'))
Local $aResult = DllCall("kernel32.dll", "int", "WideCharToMultiByte", "uint", 0, "dword", 0, "wstr", $str, "int", -1, "ptr", 0, _
                                                "int", 0, "ptr", 0, "ptr", 0)
Local $tMultiByte = DllStructCreate("char[" & $aResult[0] & "]")
Local $pMultiByte = DllStructGetPtr($tMultiByte)
Local $tBool = DllStructCreate("BOOL")

$aResult = DllCall("kernel32.dll", "int", "WideCharToMultiByte", "uint", 0, "dword", 0, "wstr", $str, "int", -1, "ptr", $pMultiByte, _
                                        "int", $aResult[0], "ptr", 0, "ptr", DllStructGetPtr($tBool))

Local $Flag = DllStructGetData($tBool, 1)
If $Flag Then
        MsgBox(0, $Flag, "至少有一个字符不能被成功转换为相对应的多字节形式")
Else
        MsgBox(0, $Flag, "全部可以由宽字符转为ansi")
EndIf

评分

参与人数 1威望 +2 金钱 +100 贡献 +5 收起 理由
afan + 2 + 100 + 5 谢谢帮忙

查看全部评分

 楼主| 发表于 2011-11-5 01:15:10 | 显示全部楼层
回复 27# happytc


    21#的代码我已经测试正确了,如有问题我会再请教,谢谢~!
 楼主| 发表于 2011-11-5 01:25:44 | 显示全部楼层
还是用UTF8格式吧!今天真的汗了!居然“联通”都不行
gzh888666 发表于 2011-11-5 01:00



    不是今天哦,是一直都这样。还有一些字符也会丢失。记得论坛就有人提问过~ 不过,与本主题的问题无关了
发表于 2011-11-5 01:42:29 | 显示全部楼层
回复  gzh888666


    不会用,估计也不可靠~

另外,ANSI编码可能自身都有问题,比如你新建一个记事 ...
afan 发表于 2011-11-5 00:48


其实ansi编码没有问题的,只是记事本默认是以ANSI编码保存文本文档的,当文档中一切字符都在 C0≤AA≤DF 80≤BB≤BF 这个范围时,记事本以为是ansi的文档地格式,就没有自动转码为utf8来显示,于是就乱码了。因"联通"就是C1 AA CD A8刚好在上述范围内

(这也是联通打不过移动的原因,连显示都有问题嘛,哈……)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-6 07:06 , Processed in 0.071308 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表