afan 发表于 2011-11-4 23:33:18

回复 15# happytc


    从来没去msdn看过,因为去之前是一头雾水,去了之后也就一身湿透了…
问题简单点,不需转换,只需判断含有1个以上的非ANSI编码字符就Ok~ “有/没有”

gzh888666 发表于 2011-11-5 00:08:06

本帖最后由 gzh888666 于 2011-11-5 00:27 编辑

回复happytc


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

afan 发表于 2011-11-5 00:13:42

回复 17# gzh888666


    _ _|| 这个只是检测非那127个字符……

gzh888666 发表于 2011-11-5 00:38:23

本帖最后由 gzh888666 于 2011-11-5 00:42 编辑

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

afan 发表于 2011-11-5 00:48:03

回复 19# gzh888666


    不会用,估计也不可靠~

另外,ANSI编码可能自身都有问题,比如你新建一个记事本文档,输入“联通”,保存后关闭,再打开看看……

happytc 发表于 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 & "]")
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, "ptr", 0, "ptr", DllStructGetPtr($tBool))

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

happytc 发表于 2011-11-5 00:59:10

本帖最后由 happytc 于 2011-11-5 01:01 编辑

不行了,21楼的那个$Str的值,居然不能显示,反正你随便拷个简体中文的codepage里没有的字符就可以了,如前面给的阿拉伯语字符

gzh888666 发表于 2011-11-5 01:00:29


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

afan 发表于 2011-11-5 01:02:04

回复 22# happytc


    在当前的网页编码模式下只能用我一楼的方法 BinaryToString 贴出源字符

gzh888666 发表于 2011-11-5 01:08:43

用IsTextUnicode进行判断。IsTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此 IsTextUnicode有可能返回不正确的结果。
也只能这样了!别的还真没什么好的办法吧?

afan 发表于 2011-11-5 01:11:17

回复 21# happytc


    测试了几个字符,均正确判断~!我再做更多的测试再反馈~ 感谢。

happytc 发表于 2011-11-5 01:11:51

回复happytc


    在当前的网页编码模式下只能用我一楼的方法 BinaryToString 贴出源字符
afan 发表于 2011-11-5 01:02 http://www.autoitx.com/images/common/back.gif

嗯,那就用这种形式吧,还不用存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 & "]")
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, "ptr", 0, "ptr", DllStructGetPtr($tBool))

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

afan 发表于 2011-11-5 01:15:10

回复 27# happytc


    21#的代码我已经测试正确了,如有问题我会再请教,谢谢~!

afan 发表于 2011-11-5 01:25:44

还是用UTF8格式吧!今天真的汗了!居然“联通”都不行
gzh888666 发表于 2011-11-5 01:00 http://www.autoitx.com/images/common/back.gif


    不是今天哦,是一直都这样。还有一些字符也会丢失。记得论坛就有人提问过~ 不过,与本主题的问题无关了

happytc 发表于 2011-11-5 01:42:29

回复gzh888666


    不会用,估计也不可靠~

另外,ANSI编码可能自身都有问题,比如你新建一个记事 ...
afan 发表于 2011-11-5 00:48 http://www.autoitx.com/images/common/back.gif

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

(这也是联通打不过移动的原因,连显示都有问题嘛,哈……)
页: 1 [2] 3
查看完整版本: [已解决]如何判断字符串中含有ANSI编码不能保存的 Unicode 格式的字符