UTF-16 到 UTF-8 PHP 转换
UTF-16 to UTF-8 PHP conversion
我有一个从 USB 调制解调器设备返回的 GSM-7 字符串,其中包含 UTF-16 编码的字符串。示例字符串为“007A006E0061006B006F007600690020010D0107017E0020006800610068006100730068”。
我需要一个 PHP 解决方案(函数)来将字符串从 UTF-16(小端)转换为 UTF-8(人类可读格式)。上面字符串的翻译应该是这个“znakovi čćž hahash”。我花了几个小时寻找合适的解决方案但没有成功。我尝试将 iconv 和 mb_convert_encoding 与许多不同的选项一起使用,但我没有得到想要的结果。我找到了一个转换字符串的在线服务,这是打印屏幕 https://prnt.sc/v09r57
提前致谢
以下代码片段可以提供帮助(我是 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;
?>
输出:.\SO382302.php
007A006E0061006B006F007600690020010D0107017E0020006800610068006100730068
znakovi čćž hahash
也就是UTF-16BE (most significat bit first), not LE (see also 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;
但是如果客户端无论如何都能够处理不同的编码(例如 Internet 浏览器),您可以立即输出 UTF-16BE:
header( 'Content-type: text/html; charset=UTF-16BE' );
echo $sUtf16;
此代码甚至适用于 PHP5,不需要额外的扩展。
几天前我已经找到了更简单的完美解决方案。如果有人需要使用:
$string="007A006E0061006B006F007600690020010D0107017E0020006800610068006100730068";
$packed = pack('H*', $string);
echo iconv("UTF-16BE","UTF-8",$packed);
谢谢大家的回复。
我有一个从 USB 调制解调器设备返回的 GSM-7 字符串,其中包含 UTF-16 编码的字符串。示例字符串为“007A006E0061006B006F007600690020010D0107017E0020006800610068006100730068”。
我需要一个 PHP 解决方案(函数)来将字符串从 UTF-16(小端)转换为 UTF-8(人类可读格式)。上面字符串的翻译应该是这个“znakovi čćž hahash”。我花了几个小时寻找合适的解决方案但没有成功。我尝试将 iconv 和 mb_convert_encoding 与许多不同的选项一起使用,但我没有得到想要的结果。我找到了一个转换字符串的在线服务,这是打印屏幕 https://prnt.sc/v09r57
提前致谢
以下代码片段可以提供帮助(我是 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;
?>
输出:.\SO382302.php
007A006E0061006B006F007600690020010D0107017E0020006800610068006100730068
znakovi čćž hahash
也就是UTF-16BE (most significat bit first), not LE (see also 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;
但是如果客户端无论如何都能够处理不同的编码(例如 Internet 浏览器),您可以立即输出 UTF-16BE:
header( 'Content-type: text/html; charset=UTF-16BE' );
echo $sUtf16;
此代码甚至适用于 PHP5,不需要额外的扩展。
几天前我已经找到了更简单的完美解决方案。如果有人需要使用:
$string="007A006E0061006B006F007600690020010D0107017E0020006800610068006100730068";
$packed = pack('H*', $string);
echo iconv("UTF-16BE","UTF-8",$packed);
谢谢大家的回复。