roamr 发表于 2012-6-11 15:58:55

编码转换中字符丢失,有没有解决的办法

本帖最后由 roamr 于 2012-6-11 16:05 编辑

$ansiString = "信乐团-天高地厚.mp3"

;第一步,将 ANSI 字符串转换成为二进制数据
$binary1 = StringToBinary($ansiString, 4)

;第二步,将二进制数据转换成为 UTF8 字符串
$utf8String = BinaryToString($binary1, 1)

;第三步,将 UTF8 字符串转换成为二进制数据,此时发现二进制数据中有部分丢失了
$binary2 = StringToBinary($utf8String, 1)

;第四部,将二进制数据转换成为 ANSI 字符串,然后有部分文字未转换成功
$endString = BinaryToString($binary2, 4)

MsgBox(0, "", $binary1 & @CRLF & $binary2)
MsgBox(0, "", $utf8String & @CRLF & $endString)
原字符串 ansiString 在转换成 utf8 编码后,得到一串乱码。
将这串乱码转回 ansi 编码,会有类似于 ? 的字符出现。分析过程发现是有数据丢失。见上面的代码示例。
不知道数据是在转换成 utf8 字符串时丢失的,还是在将 utf8 字符串转换成二进制丢失的。

求助各位前辈,有没有一种办法可以在转换编码时不丢失数据?

netegg 发表于 2012-6-11 16:03:14

不好意思,没研究过这个,不过可以告诉你代码位错了

roamr 发表于 2012-6-11 16:10:07

不好意思,没研究过这个,不过可以告诉你代码位错了
netegg 发表于 2012-6-11 16:03 http://www.autoitx.com/images/common/back.gif
代码错位,神马意思?

user3000 发表于 2012-6-11 16:55:35

回复 3# roamr

你代码的第二步及第四步错了, 应该是这样:$ansiString = "信乐团-天高地厚.mp3"

;第一步,将 ANSI 字符串转换成为 UTF8 的二进制数据
$binary1 = StringToBinary($ansiString, 4)

;第二步,将 utf8 的二进制数据转换成为 UTF8 字符串
$utf8String = BinaryToString($binary1, 4)

;第三步,将 UTF8 字符串又转换成为 ANSI 二进制数据
$binary2 = StringToBinary($utf8String, 1)

;第四步,将 ANSI 二进制数据转换成为 ANSI 字符串
$endString = BinaryToString($binary2, 1)

MsgBox(0, "", $binary1 & @CRLF & $binary2)
MsgBox(0, "", $utf8String & @CRLF & $endString)蛋大说的代码位错了, 就是说你没用对 二进制的'代码'!
第二步时, 二进制的数据是 UTF8, 所以参数只能用 4, 你却用了 1 .
同理, 第四步时, 二进制的数据是 ANSI , 所以参数也只能用 1, 用别的参数自然转换会错误!

zerobin 发表于 2012-6-11 19:11:24

我是来学习的。谢谢

xms77 发表于 2012-6-11 21:13:08

学了来了,谢谢楼上的

roamr 发表于 2012-6-11 22:08:44

回复roamr

你代码的第二步及第四步错了, 应该是这样:蛋大说的代码位错了, 就是说你没用对 二进制的'代 ...
user3000 发表于 2012-6-11 16:55 http://www.autoitx.com/images/common/back.gif

就是这样才转换编码啊,如果 BinaryToString($StringToBinary($ansiString, 4), 4) 这样不就等于没转换么。

user3000 发表于 2012-6-11 22:21:46

回复 7# roamr

那要看 $ansiString 原来的数据是什么编码!

如果是 UTF8, 当然是等于没换! 如果是你的示例中的 ANSI 编码, 那最后已经转换成 UTF8 编码了!
这能说等于没转换吗?? 看来你还是没理解这个'转换'机制!
页: [1]
查看完整版本: 编码转换中字符丢失,有没有解决的办法