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

e7arh2l6  于 2023-01-01  发布在  PHP
关注(0)|答案(1)|浏览(131)

我正在更新一个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"
xzv2uavs

xzv2uavs1#

源代码等于"\x00\x38\x00\x38\x00\x30\x00",它是7个字节,因此对于UTF-16来说是无效的长度,因为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"| x1米10英寸1x|
| 连接字符串以使其更清楚|x1米11米1x| "\x00". '8'. "\x00". '8'. "\x00". '0'. "\x00". '0'|

相关问题