DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tkzcol
今日帖子: 5
在线用户: 19
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
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;
真不知道哪理有问题
----------------------------------------------
-
作者:
男 tintin1943 (零输好) ★☆☆☆☆ -
盒子活跃会员
2014/2/25 16:41:18
1楼:  TStringStream.Create 请指定编码格式,比如 Unicode
----------------------------------------------
不喧哗 自有声 心静 思远 志行千里
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/2/25 16:56:37
2楼: 试过了,用65001也没有用的。
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/2/25 20:29:00
3楼: 我的这个代码能正常解UTF8,GB2312的(改一下代码页就可以),可以正常解出“我爱我家”BASE64编码,而且上面的代码也不是所有BIG5编码都解不出,换一个测试的字符串,比如“pGquYaZupKOmbqFDoUOhQw==”就能正常解出为“大家好不好。。。”,就是这一个"p9o/p9quYQ=="解不好,会丢字,所以写了不少天了,最近才发现这个问题。。郁闷的。
----------------------------------------------
-
作者:
男 hexpate (蜗牛大仙) ▲▲▲▲▲ -
普通会员
2014/2/26 11:49:08
4楼: 你这个问题很奇怪, 我就不明白p9o/p9quYQ== 这个是怎么来的, 如果你这个原始串本身就是错的, 你后面怎么可能又得到正确的答案呢, 就好比原始的内容就已经丢失了, 你还能指望后面的结果正确吗, 你总得说明下你这个字符串怎么产生的 或者把你的生成代码发上来, 还有原始的字符串是繁体的还是简体的, 还是unicode的, 你要说明白才好解决问题
----------------------------------------------
一只蜗牛
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/2/26 21:50:23
5楼: @hexpate:这个“p9o/p9quYQ==”保证是对的(是BIG5编码的),可以用其它第三方的BASE解析器解出来,百度上随便找一个解析器能看到,你可以自己把“我爱我家”按BIG5方式编码成BASE64,就是这个。至于原字符串的编码,上面就写的很清楚了,就是“我爱我家”的BIG5编码方式
----------------------------------------------
-
作者:
男 hexpate (蜗牛大仙) ▲▲▲▲▲ -
普通会员
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编码, 那个结果就是正确的了
----------------------------------------------
一只蜗牛
作者:
男 hexpate (蜗牛大仙) ▲▲▲▲▲ -
普通会员
2014/2/27 12:52:19
7楼: 哦, 对了, 忘记说了, 简体字转换繁体字的方式是先将简体字转成Unicode, 再将Unicode转成big5
----------------------------------------------
一只蜗牛
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/2/27 16:22:05
8楼: 明白了。谢谢hexpate,查了big5码,确实如你说所的。看来不用纠结这个问题了。只是奇怪那些在线解码工具怎么能把这个再正常反查出来呢。
----------------------------------------------
-
作者:
男 hexpate (蜗牛大仙) ▲▲▲▲▲ -
普通会员
2014/2/27 16:36:34
9楼: 什么网站可以得到正确结果, 发来网址看看
----------------------------------------------
一只蜗牛
作者:
男 hexpate (蜗牛大仙) ▲▲▲▲▲ -
普通会员
2014/2/27 16:42:44
10楼: 我按照你说的baidu搜索出来的所有解析器 都只能把 "我爱我家" 强制按照big5编码成base64 得到的是"p9o/p9quYQ==" 但是再点解密"爱"立刻变成了"?"
----------------------------------------------
一只蜗牛
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/2/27 16:49:29
11楼: 我也试了,现在确实如此。可能是前几天鬼上身了,当时就是出来“爱”字了。所以我在怀疑我代码的问题。现在不用纠结它了,一身轻松啊。再次感谢hexpate,你真是大仙噢。
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2014/2/27 16:54:01
12楼: 刚看了这个网站,http://www.mytju.com/classCode/tools/base64_big5.asp,有了一个新思路,为了原样显示,它对所有在Big5中没有对应编码的字体直接原样显示其编码值,比如爱,先转为& # 29233;,再编码为“p9omIzI5MjMzO6farmE=”,到时再显示处理。
----------------------------------------------
-
作者:
男 hexpate (蜗牛大仙) ▲▲▲▲▲ -
普通会员
2014/2/27 17:03:11
12楼: O.O, 厄 别笑话我了, 另外一个事情我说漏了, 关于转换的问题, 要想把爱字正确的显示成繁体字, 在你将gb2312转成unicode之后 还需要查映射表才能得到繁体字的爱的unicode的代码点, 然后再转成big5. 关于这个映射, windows自己已经带了函数, LCMapString, 至于你现在的代码需要不需要改 那要根据你的应用和环境才好定
----------------------------------------------
一只蜗牛
作者:
男 sczhyq (旺财) ★☆☆☆☆ -
普通会员
2014/2/27 17:17:53
13楼: 要先转换成 utf8 的 TBytes  , 再传 TBytes 的指针作为 源。
----------------------------------------------
我84砖家
作者:
男 tintin1943 (零输好) ★☆☆☆☆ -
盒子活跃会员
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;
----------------------------------------------
不喧哗 自有声 心静 思远 志行千里
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行310.5469毫秒 RSS