如何使用PHP列出文本文件中使用的所有UTF-8字符,这些字符不是ISO 8859-1字符集的一部分


How to list all the UTF-8 characters used in a text file that are not part of the ISO 8859-1 charset with PHP?

我有一个用UTF-8保存的大(900+MB)SQL(文本)文件。文件的内容是有效的,并且只有UTF-8(没有双重编码或错误的字符集)。

我想解析这个文件,找到这个文件中使用的所有UTF-8字符,这些字符不是ISO 8859-1字符集的一部分。正如您所知,ISO 8859-1中的a-zA-Z在UTF-8中是相同的二进制文件,所以我不想列出它们。

这是因为我发现使用了一些C2 A0字符(UTF-8非中断空格)。我将它们规范化为常规空格,因为两个不同的条目具有相同的文本,但不同(空格和非中断空格对用户来说是相同的,但对数据库来说是不同的)。现在我想知道其他字符(如逗号或引号)是否也有类似的问题?

我想解析这个文件,列出ISO 8859-1(Latin1)中没有的所有UTF-8字符。这样,我将只列出可能有问题的"特殊"UTF-8字符,并在插入新数据库之前手动对它们进行规范化。

以下是我想要的:

$utf8CharList = array();
$handle = fopen('somefile.sql', 'r');
while (!feof($handle)) {
  $str = fread($handle, $charLenght); /*What would be the correct length? 1 or 2 or variable?*/
  if (charIsOnlyInUTF8($str)) { /*Since "a" is binary the same in UTF-8 and ISO 8859-1 I don't want to list it*/
      if (!in_array($str, $utf8CharList)) {
          $utf8CharList[] = $str;
      }
  }
}
fclose($handle);
print_r($utf8CharList);

在我看来,你可能想找到任何非ASCII字符,因为即使是"Latin-1字符"也可能有不同的风格(例如组合和分解;不确定你是否关心这一点,但可能很重要)。由于在UTF-8中,所有ASCII字符都是一个字节,而所有其他字符都是两个或两个以上,所以这是一个非常琐碎的操作。

for ($i = 0, $length = mb_strlen($string, 'UTF-8'); $i < $length; $i++) {
    $char = mb_substr($string, $i, 1, 'UTF-8');
    if (strlen($char) > 1) {
        echo 'Found a non-ASCII character: ', $char, ' (', bin2hex($char), ')', PHP_EOL;
    }
}

这真的不是一个复杂的问题。

你基本上想要一个用于utf8的Ord()。utf8中的Ascii字符具有序数值<127.

但是,utf-8 characters>Ord()255将在2-4个字符序列中,因此,如果逐字节读取utf-8文件,则必须知道您是否在多字节utf-8字符序列中。您可以在http://php.net/ord页

与其把它们复制到这里,我敦促你确定哪一个对你有吸引力来解决你的问题。