mb_convert_encoding() 在 PHP > 8.1 中使用 UTF-16 输入

问题描述 投票:0回答:2

我正在更新一个 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-8 utf-16 octal mb-convert-encoding
2个回答
1
投票

您的源等于

"\x00\x38\x00\x38\x00\x30\x00"
,即 7 个字节,因此对于 UTF-16 而言,无效长度,每个字符始终需要 2 或 4 个字节

  • 你很幸运,PHP7 默默地接受了前 6 个字节并丢弃了第 7 个字节,
  • PHP8 现在根据 UTF-16 LE 生成更正确的输出,并想告诉您有一个不完整的第四个字符,因为它只有 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
投票

避免 PHP,只需使用 MySQL 及其

LOAD DATA INFILE
。请务必将
character set
设置为 utf16 或 utf16le,具体取决于“字节顺序”。

© www.soinside.com 2019 - 2024. All rights reserved.