提问人:Daniel 提问时间:12/29/2022 最后编辑:AmigoJackDaniel 更新时间:9/18/2023 访问量:496
PHP > 8.1 中带有 UTF-16 输入的 mb_convert_encoding()
mb_convert_encoding() with UTF-16 input in PHP > 8.1
问:
我正在更新一个 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"
答:
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 INFILE
character set
评论