zoukankan      html  css  js  c++  java
  • 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>';

    输出结果:

    在站长工具里可以正常转换,说明没有问题。

     

  • 相关阅读:
    动态规划最大利润的问题
    【转】mysql基础汇总
    mac使用frida
    Mac 下python3 [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed 解决方法
    mac使用jadx逆向app
    python桶排序代码
    requests_html使用asyncio
    async for的使用
    [转载]微信企业号:企业客户的移动应用入口
    微信服务号、订阅号、企业号差别
  • 原文地址:https://www.cnblogs.com/zdz8207/p/php-unicode-utf8-linux.html
Copyright © 2011-2022 走看看