免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1390 | 回复: 1
打印 上一主题 下一主题

一个关于转码的问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-03-18 10:32 |只看该作者 |倒序浏览
我想写一个可以查看汉字的Unicode代码的程序。在cpan上发现了一个模块Unicode::Map于是下载后安装,并写了一个程序,代码如下:
  1. #!/usr/bin/perl
  2. use Unicode::Map;
  3. $Map = new Unicode::Map("GB2312");
  4. $utf16 = $Map ->; to_unicode ("黑夜白天");
  5. map {print "%",sprintf("%x",$_)}unpack( 'U*', $utf16);
复制代码

可成功显示Unicode码%9e%d1%59%1c%76%7d%59%29
进行逆向操作,由Unicode码打印汉字

  1. #!/usr/bin/perl
  2. use Unicode::Map;
  3. $Map = new Unicode::Map("GB2312");
  4. @code=("9e","d1","59","1c","76","7d","59","29");
  5. map {$_=oct("0x$_")}@code;
  6. print $Map->;from_unicode(pack('U*',@code));
复制代码

却只能打印“夜白天”,如果换成其它的字也是有的字可以显示出来,有的字显示不出来,有的字显示出来不对,不知何故?
如果不经过pack和unpack处理,直接逆向操作又可以正确显示比如:
  1. #!/usr/bin/perl
  2. use Unicode::Map;
  3. $Map = new Unicode::Map("GB2312");
  4. $utf16 = $Map ->; to_unicode ("黑夜白天");
  5. print $Map->;from_unicode($utf16);
复制代码

搞不懂是什么原因,是我的pack,unpack用法不对么?哪位高手帮忙解释一下?不胜感激!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-03-18 16:30 |只看该作者

一个关于转码的问题?

看起來像是UTF-8與UTF-16之間的轉換問題...
Unicode::Map用的是UTF-16編碼..
但是pack("U*" 用的是UTF-8編碼...
在perl5.6.1執行時候,會有warning....
表示某些編碼在UTF-16對應到UTF-8的時候找不到了...
這個模塊2002年就不發展了...
建議你直接用Enocde模塊去做...並且統一使用UTF-8比較不會有問題...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP