【问题标题】:Converting ISO-8859-1 charcodes to UTF-8将 ISO-8859-1 字符码转换为 UTF-8
【发布时间】:2017-07-11 12:02:12
【问题描述】:

我有一个如下所示的输入字符串:

4BFC434845000000

输入字符串中的每两个字符代表 ISO-8859-1 中的十六进制代码。

  • 示例中的前两个字符 (4B) 代表数字 4B16,在 ISO-8859-1 中代表 K
  • 后两个字符(FC)代表数字FC16,代表德语中的u元音变音ü) ISO-8859-1。

上面的示例字符串表示 Küche,这是德语中厨房的意思。

输入字符串保证为 16 个字符长,因此生成的字符串将始终为 8 个字符长。未使用的字符(如示例中的)将是 00

我知道我可以使用iconv 或 PHP 中的其他函数将 ISO-8859-1 字符串转换为另一种字符编码。但是我不知道如何将 ISO-8859-1 字符码(例如 FC16 或 25210)转换为 UTF-8 字符。

当然,我可以有一个关联数组来将所有字符码映射到它们所代表的字符:

$table = array(
  0x4B => 'K',
  0xFC => 'ü',
  // ...
);

实现这一目标的最佳方法是什么?有没有一个 PHP 函数可以做到这一点?

【问题讨论】:

    标签: php character-encoding


    【解决方案1】:

    比较简单:将十六进制字符串转换为二进制,将 ISO-8859 二进制转换为 UTF-8 二进制:

    $input = '4BFC434845000000';
    echo iconv('ISO-8859-1', 'UTF-8', hex2bin($input));
    

    在某个时候可以选择删除 NUL 字节。

    【讨论】:

    • 谢谢,hex2bin 是解决方案。但是docs 说它只在 PHP >= 5.4.0 中可用。是否有早期版本的替代品,还是我必须使用 polyfill?
    • 此时你是否还需要支持 PHP pack 是替代方案:pack("H*" , $hex_string)
    猜你喜欢
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2014-07-04
    • 2020-01-25
    • 2012-01-05
    • 2011-08-01
    相关资源
    最近更新 更多