linux下php中文UTF-8轉換Unicode方法和注意事項


先說下遇到問題:1.php沒有內置unicode_ecode函數可以直接使用

2.網上很多資料都是用$str = iconv($encoding'UCS-2'$str);

window下轉換出來的是正常的,但在Linux下轉換出來的兩個字符是相反的,用在線unicode轉換工具出來的結果是亂碼。

UCS-2的編碼規則:
windows下默認是UCS-2LE。
linux下默認是UCS-2BE。用iconv(指定UCS-2)來轉換生成的是UCS-2BE的unicode,但可能php環境配置會導致不是UCS-2BE。
windows和linux等多個平台對 UCS-2 的理解不同(UCS-2LE,UCS-2BE),所以為了統一需要直接指定為UCS-2BE。

即把:$str = iconv($encoding'UCS-2'$str); 改為$str = iconv($encoding'UCS-2BE'$str);

親測轉換出來的unicode可以正常轉換的

下面是兩個本人親測可以使用的函數(為了避免以后跟系統新的內置函數同名在前面加了個my前綴):

 1 /**
 2  * utf-8 轉unicode
 3  * @param string $name
 4  * @return string
 5  */
 6 function myutf8_unicode($name){
 7     $name = iconv('UTF-8', 'UCS-2BE', $name);
 8     $len  = strlen($name);
 9     $str  = '';
10     for ($i = 0; $i < $len - 1; $i = $i + 2){
11         $c  = $name[$i];
12         $c2 = $name[$i + 1];
13         if (ord($c) > 0){
14             $str .= '\u'.base_convert(ord($c), 10, 16).str_pad(base_convert(ord($c2), 10, 16), 2, 0, STR_PAD_LEFT);
15         } else {
16             $str .= '\u'.str_pad(base_convert(ord($c2), 10, 16), 4, 0, STR_PAD_LEFT);
17         }
18     }
19     return $str;
20 }
21 
22 /**
23  * unicode 轉 utf-8
24  *
25  * @param string $name
26  * @return string
27  */
28 function myunicode_decode($name)
29 {
30     $name = strtolower($name);
31     // 轉換編碼,將Unicode編碼轉換成可以瀏覽的utf-8編碼
32     $pattern = '/([\w]+)|(\\\u([\w]{4}))/i';
33     preg_match_all($pattern, $name, $matches);
34     if (! empty($matches)) {
35         $name = '';
36         for ($j = 0; $j < count($matches[0]); $j ++) {
37             $str = $matches[0][$j];
38             if (strpos($str, '\\u') === 0) {
39                 $code = base_convert(substr($str, 2, 2), 16, 10);
40                 $code2 = base_convert(substr($str, 4), 16, 10);
41                 $c = chr($code) . chr($code2);
42                 $c = iconv('UCS-2BE', 'UTF-8', $c);
43                 $name .= $c;
44             } else {
45                 $name .= $str;
46             }
47         }
48     }
49     return $name;
50 }

測試代碼:

$ustr = myutf8_unicode('我的新衣');
echo '我的新衣:'.$ustr.'<br>';
$str = myunicode_decode($ustr);
echo $str.'<br>';

輸出結果:

在站長工具里可以正常轉換,說明沒有問題。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM