我正在更新一个 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"
您的源等于
"\x00\x38\x00\x38\x00\x30\x00"
,即 7 个字节,因此对于 UTF-16 而言,无效长度,每个字符始终需要 2 或 4 个字节。
解决方案:提供正确的输入。也许这也是因为您误解了八进制表示法,并且在不混合表示法和文字的情况下会更好地看到它:
方法 | 只有6个字节(值 ) |
使其为 8 个字节(值
|
---|---|---|
完整的十六进制表示法 |
|
|
混合十六进制表示法 |
|
|
完整的八进制表示法 |
|
|
混合八进制表示法 |
|
|
连接字符串使其更清晰 |
|
|
避免 PHP,只需使用 MySQL 及其
LOAD DATA INFILE
。请务必将 character set
设置为 utf16 或 utf16le,具体取决于“字节顺序”。