繁体   English   中英

如何列出文本文件中使用的所有UTF-8字符,这些字符不是PHP的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 charset。 如您所知,ISO 8859-1中的a-zA-Z与UTF-8中的二进制文件相同,因此我不想列出它们。

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

我想解析此文件以列出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);

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

你基本上想要utf8的Ord()。 utf8中的Ascii字符的序数值<127。

但是,utf-8字符> Ord()255将是2-4个字符序列,因此,如果逐字节读取utf-8文件,您必须知道您是否处于多字节utf-8字符序列。 您可以在http://php.net/ord页面的注释中使用许多例程实现。

我不会在这里复制它们,而是敦促你确定哪一个吸引你来解决你的问题。

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

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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM