|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2014/2/25 14:58:17 |
标题: |
Delphi XE5 Base64解码Big5字符串遇到部分乱码 |
浏览:2083 |
|
加入我的收藏 |
楼主: |
测试字符串:p9o/p9quYQ== 正确解析的结果:我爱我家 试验结果:我?我家 (爱字丢失) 测试代码: //uses Soap.EncdDecd function DecodeBase64Str2: string; var InStr, OutStr: TStringStream; begin InStr := TStringStream.Create('p9o/p9quYQ=='); InStr.SaveToFile('c:\1.txt');//输出的结果 :p9o/p9quYQ== 正确 try OutStr := TStringStream.Create(''); try DecodeStream(InStr, OutStr); OutStr.SaveToFile('c:\2.txt'); //输出的结果:и?и產 ,正确的应是и稲и產 //用第三方面软件将此按Big5编码字符查看为 我?我家 //此时已发生丢失“爱” 字 Result := TEncoding.GetEncoding(950).GetString(OutStr.Bytes); //将Big5编码转成gb2312 //Result:= '我?我家' finally OutStr.Free; end; finally InStr.Free; end; end; 真不知道哪理有问题
----------------------------------------------
- |
作者: |
|
2014/2/25 16:41:18 |
1楼: |
TStringStream.Create 请指定编码格式,比如 Unicode
----------------------------------------------
不喧哗 自有声 心静 思远 志行千里
|
作者: |
|
2014/2/25 16:56:37 |
2楼: |
试过了,用65001也没有用的。
----------------------------------------------
-
|
作者: |
|
2014/2/25 20:29:00 |
3楼: |
我的这个代码能正常解UTF8,GB2312的(改一下代码页就可以),可以正常解出“我爱我家”BASE64编码,而且上面的代码也不是所有BIG5编码都解不出,换一个测试的字符串,比如“pGquYaZupKOmbqFDoUOhQw==”就能正常解出为“大家好不好。。。”,就是这一个"p9o/p9quYQ=="解不好,会丢字,所以写了不少天了,最近才发现这个问题。。郁闷的。
----------------------------------------------
-
|
作者: |
|
2014/2/26 11:49:08 |
4楼: |
你这个问题很奇怪, 我就不明白p9o/p9quYQ== 这个是怎么来的, 如果你这个原始串本身就是错的, 你后面怎么可能又得到正确的答案呢, 就好比原始的内容就已经丢失了, 你还能指望后面的结果正确吗, 你总得说明下你这个字符串怎么产生的 或者把你的生成代码发上来, 还有原始的字符串是繁体的还是简体的, 还是unicode的, 你要说明白才好解决问题
----------------------------------------------
一只蜗牛
|
作者: |
|
2014/2/26 21:50:23 |
5楼: |
@hexpate:这个“p9o/p9quYQ==”保证是对的(是BIG5编码的),可以用其它第三方的BASE解析器解出来,百度上随便找一个解析器能看到,你可以自己把“我爱我家”按BIG5方式编码成BASE64,就是这个。至于原字符串的编码,上面就写的很清楚了,就是“我爱我家”的BIG5编码方式
----------------------------------------------
-
|
作者: |
|
2014/2/27 12:46:54 |
6楼: |
在big5码中都不存在"爱"这个字, 只有"愛"这个字, 所以你硬是把"我爱我家"按照big5的代码点进行base64转码肯定会出现错误, 正确的方式先是将 "我爱我家"按照gb2313转成big5码再进行base64编码, 或者更简单的直接使用unicode, 然后再base64, 其他的方式肯定是不正确的咯.总之"p9o/p9quYQ==" 这个就是已经丢失了信息的编码, 你可以做实验, 你所谓的解析器转码后就是"p9o/p9quYQ==" 这个时候已经发生了丢失, 只是你没意识到, 因为你输入的是简体字(936)的代码页, 但是你却选择950代码页, 你可以尝试用QQ拼音然后选择big5方式输入, 再用你的解析器选择big5进行base64编码, 那个结果就是正确的了
----------------------------------------------
一只蜗牛
|
作者: |
|
2014/2/27 12:52:19 |
7楼: |
哦, 对了, 忘记说了, 简体字转换繁体字的方式是先将简体字转成Unicode, 再将Unicode转成big5
----------------------------------------------
一只蜗牛
|
作者: |
|
2014/2/27 16:22:05 |
8楼: |
明白了。谢谢hexpate,查了big5码,确实如你说所的。看来不用纠结这个问题了。只是奇怪那些在线解码工具怎么能把这个再正常反查出来呢。
----------------------------------------------
-
|
作者: |
|
2014/2/27 16:36:34 |
9楼: |
什么网站可以得到正确结果, 发来网址看看
----------------------------------------------
一只蜗牛
|
作者: |
|
2014/2/27 16:42:44 |
10楼: |
我按照你说的baidu搜索出来的所有解析器 都只能把 "我爱我家" 强制按照big5编码成base64 得到的是"p9o/p9quYQ==" 但是再点解密"爱"立刻变成了"?"
----------------------------------------------
一只蜗牛
|
作者: |
|
2014/2/27 16:49:29 |
11楼: |
我也试了,现在确实如此。可能是前几天鬼上身了,当时就是出来“爱”字了。所以我在怀疑我代码的问题。现在不用纠结它了,一身轻松啊。再次感谢hexpate,你真是大仙噢。
----------------------------------------------
-
|
作者: |
|
2014/2/27 16:54:01 |
12楼: |
刚看了这个网站,http://www.mytju.com/classCode/tools/base64_big5.asp,有了一个新思路,为了原样显示,它对所有在Big5中没有对应编码的字体直接原样显示其编码值,比如爱,先转为& # 29233;,再编码为“p9omIzI5MjMzO6farmE=”,到时再显示处理。
----------------------------------------------
-
|
作者: |
|
2014/2/27 17:03:11 |
12楼: |
O.O, 厄 别笑话我了, 另外一个事情我说漏了, 关于转换的问题, 要想把爱字正确的显示成繁体字, 在你将gb2312转成unicode之后 还需要查映射表才能得到繁体字的爱的unicode的代码点, 然后再转成big5. 关于这个映射, windows自己已经带了函数, LCMapString, 至于你现在的代码需要不需要改 那要根据你的应用和环境才好定
----------------------------------------------
一只蜗牛
|
作者: |
|
2014/2/27 17:17:53 |
13楼: |
要先转换成 utf8 的 TBytes , 再传 TBytes 的指针作为 源。
----------------------------------------------
我84砖家
|
作者: |
|
2014/2/27 21:31:49 |
6楼: |
请参考 这段代码 var s, strEncode, strDecode: string; by: TBytes; begin s := 'abc中文123'; by := TEncoding.Unicode.GetBytes(s); strEncode := EncodeBase64(by, Length(by)); strDecode := WideStringOf(DecodeBase64(strEncode)); ShowMessage(strEncode + ' ' + strDecode); end;
----------------------------------------------
不喧哗 自有声 心静 思远 志行千里
|
|