gpt4 book ai didi

php - 高性能地将 CESU-8 转换为 UTF-8

转载 作者:行者123 更新时间:2023-12-02 15:29:26 28 4
gpt4 key购买 nike

我有一些原始文本,通常是有效的 UTF-8 字符串。然而,有时会发现输入实际上是 CESU-8 字符串。从技术上来说,可以检测到这一点并转换为 UTF-8,但由于这种情况很少发生,我宁愿不花费大量 CPU 时间来执行此操作。

是否有任何快速方法来检测字符串是否使用CESU-8或UTF-8编码?我想我总是可以盲目地将“UTF-8”转换为UTF-16LE,然后使用iconv()转换为UTF-8我可能每次都会得到正确的结果,因为 CESU-8 与 UTF-8 足够接近,因此可以正常工作。 您能提出更快的建议吗?(我希望输入字符串为 CESU-8,而不是所有字符串出现次数的 0.01-0.1% 左右的有效 UTF-8。)

(CESU-8 是一种非标准字符串格式,其中包含以 UTF-8 编码的 16 位代理项对。从技术上讲,UTF-8 字符串应包含这些代理项对表示的字符,而不是代理项对本身.)

最佳答案

这是转换函数的更高效版本:

$regex = '@(\xED[\xA0-\xAF][\x80-\xBF]\xED[\xB0-\xBF][\x80-\xBF])@';
$s = preg_replace_callback($regex, function($m) {
$in = unpack("C*", $m[0]);
$in[2] += 1; // Effectively adds 0x10000 to the codepoint.
return pack("C*",
0xF0 | (($in[2] & 0x1C) >> 2),
0x80 | (($in[2] & 0x03) << 4) | (($in[3] & 0x3C) >> 2),
0x80 | (($in[3] & 0x03) << 4) | ($in[5] & 0x0F),
$in[6]
);
}, $s);

该代码仅转换高位代理后面跟着低位代理,并将两个三字节的 CESU-8 序列直接转换为四字节的 UTF-8 序列,即来自

ED       A0-AF    80-BF    ED       B0-BF    80-BF
11101101 1010aaaa 10bbbbbb 11101101 1011cccc 10dddddd

F0-F4    80-BF    80-BF    80-BF
11110oaa 10aabbbb 10bbcccc 10dddddd // o is "overflow" bit

这是一个 online example .

关于php - 高性能地将 CESU-8 转换为 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34151138/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com