修复无效的UTF8字符

时间:2018-07-17 12:56:18

标签: php character-encoding iconv

我要将txt文件导入sqlite数据库,然后使用php以json格式输出这些值

json_encode失败,抱怨非法字符。我将其跟踪到字符串terrains à bâtir中的两个重音字符-当我在Sublime中打开文件时,此字符串可以正常显示,但是在Textedit中,该字符串显示为terrains ‡ b‚tir

有关文件及其内容的一些信息

  • file -i file.txt告诉我text/plain; charset=us-ascii
  • mb_detect_encoding()上的有效字符串告诉我它是ASCII
  • mb_detect_encoding()上的无效字符串告诉我它是UTF-8
  • hexdump -C file.txt | grep terrains将字符显示为点:

00a4eb30 7c 74 65 72 72 61 69 6e 73 20 e0 20 62 e2 74 69 ||terrains . b.ti|

  • cat file.txt | tail -c +1671338 | head -c 20将字符显示为�,它们以相同的方式出现在我的sqlite GUI中。

    ns � b�tir|11111|AAA

我知道可以使用TRANSLIT或IGNORE选项使用iconv来“修复”此问题,但最终我得到的结果与预期的有所不同。

$encoding = mb_detect_encoding($row[2]);
if($encoding !== 'ASCII') {
    $enc = mb_detect_encoding($row[2]);
    $converted = iconv('UTF-8', 'ASCII//IGNORE', $row[2]);
    print_r($converted);
}

使用IGNORE(显然)使用输出terrains btir,并且使用TRANSLIT时,该方法会抱怨iconv(): Detected an illegal character in input string

我的目标是使用PHP将这些字符恢复为适当的重音形式。我该怎么做?我猜想hexdump输出提供了一些线索,但是我无法弄清哪些字节是有问题的字节或如何解决它们。

0 个答案:

没有答案