注册 登录
橘汁仙剑网 返回首页

橘汁的个人空间 https://ojpal.com/?1 [收藏] [复制] [分享] [RSS]

日志

PHP iconv win系统和Linux结果不同导致乱码的解决方法

已有 4831 次阅读2009-11-2 10:14 |个人分类:网站建设

今天在开发中遇到一个编码的问题,

PHP代码
  1. function unicode_encode( $name ){  
  2.     $name = iconv( "UTF-8""UCS-2"$name );  
  3.     $len = strlen$name );  
  4.     $str = "";  
  5.     $i = 0;  
  6.     for ( ; $i < $len - 1;  $i += 2 ){  
  7.     $c = $name[$i];  
  8.     $c2 = $name[$i + 1];  
  9.         if ( 0 < ord( $c ) ){  
  10.             $c2 = base_convert( ord( $c2 ), 10, 16 );  
  11.             if ( strlen$c2 ) == 1 ){  
  12.                 $c2 = "0".$c2;  
  13.             }  
  14.             $str .= "\\u".base_convert( ord( $c ), 10, 16 ).$c2;  
  15.         }else{  
  16.             $str .= $c2;  
  17.         }  
  18.     }  
  19.     return $str
  20. }  

同样的代码在Windows ,Linux 的结果却不同

最后查出原来问题出在 icovn转换上面,也就是在Windows下面的Unicode 变不是UTF-16,而是UCS-2, Linux下面应该是UCS-2BE.

解决办法是

PHP代码
  1. $name = iconv( "UTF-8""UCS-2BE"$name );  

 

一般认为Windows下以16bit表示的Unicode并不是UTF-16,而是UCS-2。UCS-2是一种编码格式,同时也是指以一一对应关系的Unicode实现。在UCS-2中只能表示U+0000到U+FFFF的BMP(Basic Multilingual Plane ) Unicode编码范围,属于定长的Unicode实现,而UTF-16是变长的,类似于UTF-8的实现,但是由于其字节长度的增加,所以BMP部分也做到了一一对应,但是其通过两个双字节的组合可以做到表示全部Unicode,表示范围从U+0000 到 U+10FFFF。关于这一点,我在很多地方都看到混淆了,混的我自己都有点不太肯定自己的说法了,还好在《UTF-16/UCS-2》中还是区别开了,不然我不知道从哪里去寻找一个正确答案。(哪怕在IBM的相关网页上都将UCS-2作为UTF-16的别名列出)

扩展阅读:

  1.什么是UCS和ISO10646?
  国际标准ISO10646定义了通用字符集(Universal Character Set, UCS). UCS是所有其它字符集标准的一个超集,它保证也其它字符集双向兼容,即编码间相互转换不会丢失任何信息。UCS字符集U+0000到U+007F与 US-ASCII是一致的。
  2.什么是UNICODE
  历史上, 有两个独立的, 创立单一字符集的尝试. 一个是国际标准化组织(ISO)的 ISO 10646 项目, 另一个是由(一开始大多是美国的)多语言软件制造商组成的协会组织的 Unicode 项目. 幸运的是, 1991年前后, 两个项目的参与者都认识到, 世界不需要两个不同的单一字符集. 它们合并双方的工作成果, 并为创立一个单一编码表而协同工作. 两个项目仍都存在并独立地公布各自的标准, 但 Unicode 协会和 ISO/IEC JTC1/SC2 都同意保持 Unicode 和 ISO 10646 标准的码表兼容, 并紧密地共同调整任何未来的扩展.
  3.什么是UTF-8(一种传送和存储格式)
  UCS和UNICODE为每个字符分配了一个对应的整数,但并没有明确说明其实现机制.故存在多种编码方式,其中以两个字节和四个字节来存储一个字符的方法分别叫UCS-2, UCS-4,要将一个ASCII文件转换成一个UCS-2文件只要在每个字节前加一个字节0X00,转换成UCS-4只要在每个字节前加三个0X00。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

联系我们|小黑屋|手机版|排行榜|橘汁仙剑网 ( 浙ICP备18045743号-1

GMT+8, 2024-4-24 03:31 , Processed in 0.092719 second(s), 20 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回顶部