繁体   English   中英

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

[英]mb_convert_encoding() with UTF-16 input in PHP > 8.1

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

您的来源等于"\x00\x38\x00\x38\x00\x30\x00" ,它是 7 个字节,因此对于 UTF-16 来说是一个无效长度,它总是需要每个字符 2 或 4 个字节

  • 你很幸运 PHP7 确实默默地接受了前 6 个字节并丢弃了第 7 个,
  • 而 PHP8 现在根据 UTF-16 LE 生成更正确的 output 并想告诉您第 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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM