gpt4 book ai didi

php - 通用且干净的 UTF-8 编码 (PHP)

转载 作者:搜寻专家 更新时间:2023-10-31 22:14:24 24 4
gpt4 key购买 nike

我希望能够在一次调用中将任何 字符集转换为干净的 UTF-8(我们使用的是 PHP)。

用于 Apache Solr 索引;问题是 Solr 使用的 XML 解析器(用 Java 编写)在遇到非法 UTF-8 时抛出异常。

我们尝试了 iconv() 但它有时会在警告后截断字符串,丢失一些数据,即使启用了 //TRANSLIT 和/或 //IGNORE

utf8_encode() 仅适用于 latin1。

我们使用多种编码从多种来源导入多种文档,我们需要完全干净的 UTF-8 输出。我们不关心时间/资源问题。

感谢您明智的回答!

最佳答案

  • 您可以尝试使用 mb_convert_encodingmb_detect_encoding
  • 导入这些文档时,您确实需要内容编码之类的东西。如果您从 Web 建立索引,请查找内容类型 header 和实际 HTML 文件的内容。始终将此作为您的主要来源 - 可能会退回到检测,但检测实际上只是猜测
  • 如果这两个选项没有帮助,我建议您编写自己的代码来检测流中的无效字符。然后只需替换这些并使用 iconv()

iconv 在错误后不继续的原因很简单:在某些字符编码中,正确读取字节很重要,因为一个字符可能基于多个字节。 UTF-8 通过使用位掩码来检测字符何时完成来对此进行补偿,但并非所有编码都具有此功能。在这样的编码中,单个字节错误意味着字符串的其余部分可能是乱码,这不是您想要的。 (我不完全确定,但你应该能够通过采用 UTF-16 字符串并删除文件中的第五个字节来复制它)

嘿,我什至会说明这个问题 :-) 下面是一个(有点)UTF-16 示例,每个字符使用 2 个字节。

[74 00] [65 00] [73 00] [74 00] = test

现在让我们删除一个字节 - 这是第一个 0x00

[74 65] [00 73] [00 74] [00] = ....

我不知道它实际上会变成什么,但正如您所看到的,它只是在缺少一个字节的那一刻将字符串的其余部分打散。如果你幸运的话,你会用中文编制索引。

关于php - 通用且干净的 UTF-8 编码 (PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8433265/

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