【问题标题】:UTF-16 to UTF-8 PHP conversionUTF-16 到 UTF-8 PHP 转换
【发布时间】:2021-01-30 13:42:28
【问题描述】:

我有一个从 USB 调制解调器设备返回的 GSM-7 字符串,其中包含 UTF-16 编码字符串。示例字符串为“007A006E0061006B006F007600690020010D0107017E0020006800610068006100730068”。

我需要一个 PHP 解决方案(函数)将字符串从 UTF-16(小端序)转换为 UTF-8(人类可读格式)。从上面的字符串翻译应该是这个“znakovi čćž haha​​sh”。我花了几个小时寻找合适的解决方案,但没有成功。我尝试使用带有许多不同选项的 iconv 和 mb_convert_encoding,但我没有得到想要的结果。我找到了一个在线服务来转换字符串,这里是打印屏幕https://prnt.sc/v09r57

提前谢谢你

【问题讨论】:

    标签: php utf-8 utf-16le


    【解决方案1】:

    以下代码 sn-p 可能会有所帮助(我是php 菜鸟,所以自己制作一个函数;也许你需要安装或enable PHP extension intl):

    <?php
    $strinput = "007A006E0061006B006F007600690020010D0107017E0020006800610068006100730068";
    print "$strinput\n";
    
    $stroutput = '';
    for ( $i = 0; $i < strlen($strinput); $i += 4 ) {
        $stroutput .= IntlChar::chr(hexdec( substr( $strinput,$i,4)));
    };
    
    print $stroutput;
    ?>
    

    输出.\SO\64382302.php

    007A006E0061006B006F007600690020010D0107017E0020006800610068006100730068
    znakovi čćž hahash
    

    【讨论】:

      【解决方案2】:

      这是 UTF-16BE (most significat bit first),而不是 LE(另请参阅 UTF-16 examples)。

      // Hexadecimal text: each 2 characters describe 1 byte
      $sText= '007A006E0061006B006F007600690020010D0107017E0020006800610068006100730068';
      
      // Actually forming bytes of that text, i.e. making '7A' a 'z' and '20' a ' '
      $sUtf16= pack( 'H*', $sText );
      

      如果你真的需要 UTF-8:

      // Since we now have an actual encoding: convert it to the wanted one
      $sUtf8= mb_convert_encoding( $sUtf16, 'UTF-8', 'UTF-16BE' );
      
      // To make sure the consumer interpretes the data correctly
      header( 'Content-type: text/plain; charset=UTF-8' );
      echo $sUtf8;
      

      但如果客户端无论如何都能够处理不同的编码(例如互联网浏览器),您可以立即输出 UTF-16BE:

      header( 'Content-type: text/html; charset=UTF-16BE' );
      echo $sUtf16;
      

      此代码甚至适用于 PHP5,不需要额外的扩展。

      【讨论】:

        【解决方案3】:

        几天前我已经找到了可以完美运行的更简单的解决方案。如果有人需要使用:

            $string="007A006E0061006B006F007600690020010D0107017E0020006800610068006100730068";
            $packed = pack('H*', $string);
            echo iconv("UTF-16BE","UTF-8",$packed);
        

        谢谢大家的回复。

        【讨论】:

        • iconv() 不保证可用,并且可能因系统而异 - 我使用 mb_convert_encoding() 出于这个原因和其他原因。而且您自己也无法找到它,因为您确信您使用的是 UTF-16LE,而不是 UTF-16BE。
        猜你喜欢
        • 1970-01-01
        • 2015-09-21
        • 2015-09-19
        • 1970-01-01
        • 2020-01-28
        • 2016-05-31
        • 1970-01-01
        • 2017-09-24
        相关资源
        最近更新 更多