用PHP将Unicode 转化为UTF-8

function?unescape($str) {

????$str?= rawurldecode($str);

????preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r);

????$ar?= $r[0];

????//print_r($ar);

????foreach($ar?as?$k=>$v) {

????????if(substr($v,0,2) == "%u"){

????????????$ar[$k] = iconv("UCS-2BE","UTF-8",pack("H4",substr($v,-4)));

??}

????????elseif(substr($v,0,3) == "&#x"){

????????????$ar[$k] = iconv("UCS-2BE","UTF-8",pack("H4",substr($v,3,-1)));

??}

????????elseif(substr($v,0,2) == "&#") {

?????????????

????????????$ar[$k] = iconv("UCS-2BE","UTF-8",pack("n",substr($v,2,-1)));

????????}

????}

????return?join("",$ar);

}

echo?unescape("紫星蓝");

今天有用户反馈,表单系统用户提交的数据中文会乱码。测试发现问题出在 iconv 转换上。

iconv(‘UCS-2‘, ‘GBK‘, ‘中文‘)

Google 搜索发现,原因是 Linux 服务器上 UCS-2 编码方式与 Winodws 不一致。

于是,我改成? iconv(‘UCS-2BE‘, ‘GBK‘, ‘中文‘) 试试,中文正常了

??

以下是有关两个平台 UCS-2 编码的潜规则:

?

1, UCS-2 不等于 UTF-16。 UTF-16 每个字节使用 ASCII 字符范围编码,而 UCS-2 对每个字节的编码可以超出 ASCII 字符范围。UCS-2 和 UTF-16 对每个字符至多占两个字节,但是他们的编码是不一样的。

?

2, 对于 UCS-2, windows 下默认是 UCS-2LE。用 MultibyteToWidechar(或者A2W)生成的是 UCS-2LE 的 unicode。windows记事本可以将文本保存为 UCS-2BE,相当于多了层转换。

?

3, 对于 UCS-2, linux 下默认是 UCS-2BE。用iconv(指定UCS-2)来转换生成的是 UCS-2BE 的 unicode。如果转换windows平台过来的 UCS-2, 需要指定 UCS-2LE。

?

4, 鉴于windows和linux等多个平台对 UCS-2 的理解不同(UCS-2LE,UCS-2BE)。MS 主张 unicode 有个引导标志(UCS-2LE FFFE, UCS-2BE FEFF),以表明下面的字符是 unicode 并且判别 big-endian 或 little-endian。 所以从 windows 平台过来的数据发现有这个前缀,不用慌张。

?

5, linux 的编码输出,比如从文件输出,从 printf 输出,需要控制台做适当的编码匹配(如果编码不匹配,一般和该程序编译时的编码有若干关系),而控制台的转换输入需要查看当前的系统编码。比如控制台当前的编码是 UTF-8, 那么 UTF-8 编码的东西能正确显示,GBK 就不能;同样,当前编码是 GBK, 就能显示 GBK 编码,后来的系统应该更智能的处理好更多的转换了。不过通过 putty 等终端还是需要设置好终端的编码转换以解除乱码的烦恼。

PHP中对汉字进行UNICODE编码和解码的实现

?//将内容进行UNICODE编码

function?unicode_encode($name)

{

????$name?= iconv(‘UTF-8‘, ‘UCS-2‘, $name);

????$len?= strlen($name);

????$str?= ‘‘;

????for?($i?= 0; $i?< $len?- 1; $i?= $i?+ 2)

????{

????????$c?= $name[$i];

????????$c2?= $name[$i?+ 1];

????????if?(ord($c) > 0)

????????{??? // 两个字节的文字

????????????$str?.= ‘\u‘.base_convert(ord($c), 10, 16).base_convert(ord($c2), 10, 16);

????????}

????????else

????????{

????????????$str?.= $c2;

????????}

????}

????return?$str;

}

$name?= ‘MY,你大爷的‘;

$unicode_name=unicode_encode($name);

echo?‘<h3>‘.$unicode_name.‘</h3>‘;

// 将UNICODE编码后的内容进行解码

function?unicode_decode($name)

{

????// 转换编码,将Unicode编码转换成可以浏览的utf-8编码

????$pattern?= ‘/([\w]+)|(\\\u([\w]{4}))/i‘;

????preg_match_all($pattern, $name, $matches);

????if?(!empty($matches))

????{

????????$name?= ‘‘;

????????for?($j?= 0; $j?< count($matches[0]); $j++)

????????{

????????????$str?= $matches[0][$j];

????????????if?(strpos($str, ‘\\u‘) === 0)

????????????{

????????????????$code?= base_convert(substr($str, 2, 2), 16, 10);

????????????????$code2?= base_convert(substr($str, 4), 16, 10);

????????????????$c?= chr($code).chr($code2);

????????????????$c?= iconv(‘UCS-2‘, ‘UTF-8‘, $c);

????????????????$name?.= $c;

????????????}

????????????else

????????????{

????????????????$name?.= $str;

????????????}

????????}

????}

????return?$name;

}

echo?‘MY,\u4f60\u5927\u7237\u7684 -> ‘.unicode_decode($unicode_name);

  

用PHP将Unicode 转化为UTF-8

时间: 2024-11-01 14:55:09

用PHP将Unicode 转化为UTF-8的相关文章

字符编码终极笔记:ASCII、Unicode、UTF-8、UTF-16、UCS、BOM、Endian

很详细很不错,转过来学习一下: 转载自:http://www.cnblogs.com/lidabo/archive/2013/11/27/3446518.html 1.字符编码.内码,顺带介绍汉字编码 字符必须编码后才能被计算机处理.计算机使用的缺省编码方式就是计算机的内码.早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5. GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号.汉字区的内码范围

PHP实现Unicode和Utf-8互相转换

  一. 编码原理及实现 unicode编码是实现utf-8与gb系列编码(gb2312.gbk.gb18030)转换的基础,虽然我们也可以直接做一个utf-8到这些编码 的对照表,但很少有人会这么做,因为utf-8的可变编码具有不确定性,因此一般情况使用都是unicode与gb编码的对照 表,unicode(UCS-2)实际上是utf-8的基础编码,utf-8只是它的一种实现而已,两者存在下面的对应关系: Unicode符号范围           | UTF-8编码方式 u0000 0000

刨根究底字符编码之十——Unicode字符集的字符编码方式CEF以及码点、码元

Unicode字符集的字符编码方式CEF以及码点.码元 一.字符编码方式CEF的选择 1. 由于Unicode字符集非常大,有些字符的编号(码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须使用两个或两个以上字节. 比如,汉字"严"的Unicode码(Unicode码点值.Unicode编号)是十六进制数4E25,转换成二进制数有15位(100 1110 0010 0101),对"严"这个字符的编号进行编码的话,至少需要2个字节.表示其他更大编号

[C语言]unicode与utf-8编码转换(一)

Unicode与UTF-8编码转换(一) Unicode是一个符号集合,规定了符号的二进制代码,而UTF-8是Unicode的一种实现,具体Unicode和UTF-8的联系如下所示:         Unicode符号范围                    UTF-8编码规则  1 | 0000 0000 - 0000 007F |                                              0xxxxxxx    2 | 0000 0080 - 0000 07

了解Unicode编码

制定Unicode编码标准的组织有两个,一个是国际标准化组织ISO,一个是多语言软件制造商组成的统一码联盟. 通用字符集UCS(Universal Character Set)是由ISO制定的编码方案,UCS-2用2个字节编码,UCS-4用4个字节编码. unicode转换格式UTF(Unicode Transformation Format)是根据Unicode字符集按照一定转换规则在计算机上实现的编码方案. UTF-8是可变长度字符编码,与ASCII码相对应的部分(0x00~0x7F之间的字

字符编解码的故事–ASCII,ANSI,Unicode,Utf-8区别(转)

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们认为8个开关状态作为原子单位很好,于是他们把这称为”字节”. 再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出更多的状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为”计算机”. 开始计算机只在美国用.八位的字节一共可以组合出256(2的8次方)种不同的状态. 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端设备或者打印机遇上这些约定好的字

ANSI, UTF-8, Unicode, GBK, GB2312 字符编码小结

这两天碰见一个Bug,涉及到字符编码,一通乱搜后,索性研究了下,整理出来,以便今后查阅. ASCII码,0~127,128个,这个就不用多说了,他是计算机文明的基石.但是这里面只有英文字母,其他国家如何把本国的文字输入到电脑中呢?所以基本每种语言都有自己的字符集,如汉字就有GB2312(简体中文),BIG5(繁体中文)等等. 但不同的ANSI编码在不同语言之间是不兼容的,所以对于不同的操作系统之间文件的传输,或者在同样的操作系统下,源文件语言不同于OS的语言文件的传输,需要转换成UTF-8格式.

Python中的Unicode编码和UTF-8编码

下午看廖雪峰的Python2.7教程,看到 字符串和编码 一节,有一点感受,结合崔庆才的Python博客 ,把这种感受记录下来: ASCII码:是用一个字节(8bit, 0-255)中的127个字母表示大小写字母,数字和一些符号.主要用来表示现代英语和西欧语言. 所以处理中文就出现问题了,因为中文处理至少需要两个字节,所以中国制定了GB2312. 所以,各国制定了各国的标准.日本制定了Shift_JIS,韩国制定了Euc-kr...那么,乱码就来了. 为了统一,Unicode诞生了.统一码把所有

字节的高低位知识,Ascii,GB2312,UNICODE等编码的关系与来历

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节". 再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为"计算机". 开始计算机只在美国用.八位的字节一共可以组合出256(2的8次方)种不同的状态. 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端.打印机遇上约