免费注册 查看新帖 |

Chinaunix

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

字符编码转UTF-8编码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-04 23:19 |只看该作者 |倒序浏览
本帖最后由 paktc 于 2010-09-04 23:26 编辑

估计很少人会用到……
我也是偶然遇到要处理这个东西,朋友的手机坏了,换了一个杂牌的便宜手机,
打算把 内存卡上的通讯录转过去,已经提取了联系人信息。
结果杂牌的手机同步软件都没有。尝试选择在T卡新建一个联系人,
列出最新建立的文件,发现是通过建立通讯录文件实现的。  联系人姓名.vcf格式

啊安.vcf
BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E9=98=BF=E5=AE=89     #这里就是两个字的编码
TEL;CELL:123  
END:VCARD

没错编码就是UTF-8的,改变都不行,折腾死了……

关于对照表。网上找了很久未果,
所以我就学着编写了一个 字符转 utf-8编码的脚本  (完整的导出通讯录的东西就不放上来啦)

  1. #!/usr/bin/perl
  2. open READ,"<next.x";

  3. $lv_[1]=00000000;
  4. $lv_[2]=11000000;
  5. $lv_[3]=11100000;
  6. $lv_[4]=11110000;
  7. $lv_[5]=11111000;
  8. $lv_[6]=11111100;

  9. use utf8;

  10. $a="我";
  11. printf "%s\n",&code2utf(ord $a);
  12. print "END!";
  13. <STDIN>;


  14. sub code2utf {
  15. my ($code,$bin,$level,$hex,$tmp,$result);
  16. $code=$_[0];
  17. $bin=sprintf "%b",$code;

  18. $level=1;
  19. if (length($bin)>7) {
  20.   while (length($bin)>=6) {
  21.      $level+=1;
  22.      $bin=~s/.{6}$//;
  23.      $hex=sprintf "%X",&bin2int(10 . $&);
  24.      $result=$hex ."-". $result;
  25.   }
  26. }

  27. $tmp=substr($lv_[$level],0,8-length($bin));
  28. $hex=sprintf "%X",&bin2int($tmp . $bin);
  29. $result=$hex ."-". $result;
  30. $result=~s/-$//;  
  31. $result;   #result - string
  32. }

  33. sub bin2int {
  34. my ($a,$str,$all,$act);
  35. $a=$_[0];
  36. $str="";
  37. $all=0;
  38. $act=0;
  39. do {
  40.    $b=($a % 10) * (2**$act);  #** as ^ of the calc
  41.    $all+=$b;
  42.    $act+=1;
  43.    $a=int ($a/10);
  44. } until ($a==0);
  45. int ($all);
  46. }

复制代码

结果为 :
E6-88-91

写的很累赘,请多多指教!


关于utf-8的编码详细信息就不列举啦。 从C语言一站式学习.html 学的一些经验

例如某字符的值 170


UTF-8: 0xC2 0xAA

0xC2 -> 11000010
0xAA -> 10101010

其二进制值 : 170 = 10101010    (也就是分为了10 和101010)
根据以下规则分段转化为utf-8 编码 ,xxx是有效区间

引用资料 :
具体来说,UTF-8编码有以下几种格式:
U-00000000 – U-0000007F:  0xxxxxxx
U-00000080 – U-000007FF:  110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF:  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF:  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF:  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
======================================
10 和101010 对应:
110xxxxx 10xxxxxx -> 11000010 10101010

======================================

ubuntu的字符映射表有列出字符的  各种编码,挺爽的说……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP