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

标签 php encoding utf-8 character-encoding solr

我希望能够在一次调用中将任何 字符集转换为干净的 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/

相关文章:

java - 如何检测编码不匹配

mysql - 让 MySQL 在 SELECT 调用中正确区分日语字符

http - 请帮助我跟踪如何在每一步处理字符集

php - 从一种形式将两个连续行放入表中

php - 在php中将多维数组中的数据插入MySQL

php - Doctrine - 按外部聚合值过滤

php - 从 Codeigniter 中的多个选择框中获取值

java - 为什么 byteArray 的长度是 22 而不是 20?

ruby `encode' : "\xC3"从 ASCII-8BIT 到 UTF-8 (Encoding::UndefinedConversionError)

utf-8 - 如何在不使用平台特定功能的情况下打印 UTF-8 字符串?