PHP > 8.1 中带有 UTF-16 输入的 mb_convert_encoding()

mb_convert_encoding() with UTF-16 input in PHP > 8.1

提问人:Daniel 提问时间:12/29/2022 最后编辑:AmigoJackDaniel 更新时间:9/18/2023 访问量:496

问:

我正在更新一个 PHP 应用程序,该应用程序导入以 UTF-16 编码的 CSV(来自 Google 关键字规划师),并将值转换为 UTF-8。

在 PHP 8 之前,它按预期工作,但从 PHP 8.1 开始,从 UTF-16 转换为 UTF-8 后,值增加了一个:?

var_dump(mb_convert_encoding("\0008\0008\0000\000", "UTF-8", "UTF-16"));

// Output with PHP 8.1.3 - 8.1.13, 8.2.0:
// string(4) "880?"

// Output with PHP 7.4.32, 8.0.8 - 8.0.26:
// string(3) "880"
php utf-16 八进制 mb-convert-encoding

评论


答:

1赞 AmigoJack 12/30/2022 #1

您的源等于 ,即 7 个字节,因此对于 UTF-16 来说,这是一个无效的长度,每个字符总是需要 2 或 4 个字节"\x00\x38\x00\x38\x00\x30\x00"

  • 你很幸运,PHP7 默默地接受了前 6 个字节并删除了第 7 个字节,
  • 而 PHP8 现在根据 UTF-16 LE 生成更正确的输出,并想告诉你有一个不完整的第 4 个字符,因为它只有 1 个字节。

解决方案:提供适当的输入。也许这也是因为你误解了八进制符号,如果不完全混合符号和文字,它会更好地看到它:

方法 只有 6 个字节(值'880') 设为 8 个字节(值'8800'
全十六进制表示法 "\x00\x38\x00\x38\x00\x30" "\x00\x38\x00\x38\x00\x30\x00\x30"
混合十六进制表示法 "\x008\x008\x000" "\x008\x008\x000\x000"
全八进制表示法 "\000\070\000\070\000\060" "\000\070\000\070\000\060\000\060"
混合八进制表示法 "\0008\0008\0000" "\0008\0008\0000\0000"
串联字符串以使其更清晰 "\x00". '8'. "\x00". '8'. "\x00". '0' "\x00". '8'. "\x00". '8'. "\x00". '0'. "\x00". '0'

评论

0赞 Daniel 12/30/2022
没错,似乎在 OSX 原生 php 安装上解析 UTF-16 LE 编码的 CSV 按预期工作,但在我的 Docker 设置中,编码搞砸了。
0赞 Rick James 9/18/2023 #2

避免使用PHP,只需使用MySQL及其.请务必将 设置为 utf16 或 utf16le,具体取决于“字节序”。LOAD DATA INFILEcharacter set