我正在更新一个PHP应用程序,它可以导入以UTF-16编码的CSV(来自Google Keyword Planner),并且值将转换为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条答案
按热度按时间xzv2uavs1#
源代码等于
"\x00\x38\x00\x38\x00\x30\x00"
,它是7个字节,因此对于UTF-16来说是无效的长度,因为UTF-16总是需要每个字符2或4个字节。解决方案:提供正确的输入。也许这也是因为你误解了八进制表示法,如果不把表示法和文字混合在一起,你会看得更清楚:
| 进场|仅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"
| x1米10英寸1x|| 连接字符串以使其更清楚|x1米11米1x|
"\x00". '8'. "\x00". '8'. "\x00". '0'. "\x00". '0'
|