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

如何列出一个文本文件中使用的所有UTF-8字符,这些字符不是PHP的ISO 8859-1字符集的一部分?,php,encoding,utf-8,character-encoding,Php,Encoding,Utf 8,Character Encoding,我有一个大的(900+MB)SQL(文本)文件保存在UTF-8中。文件的内容是有效的,并且只有UTF-8(没有双重编码或错误的字符集) 我想解析此文件,以查找此文件中使用的所有不属于ISO 8859-1字符集的UTF-8字符。正如您所知,ISO 8859-1中的a-zA-Z在UTF-8中是相同的二进制文件,因此我不想列出它们 这是因为我发现使用了一些c2a0字符(UTF-8非中断空格)。我将它们规范化为常规空格,因为两个不同的条目具有相同的文本,但不同(空格和非中断空格在用户看来相同,但在数据库

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

我想解析此文件,以查找此文件中使用的所有不属于ISO 8859-1字符集的UTF-8字符。正如您所知,ISO 8859-1中的a-zA-Z在UTF-8中是相同的二进制文件,因此我不想列出它们

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

我想解析这个文件,列出ISO 8859-1(拉丁文1)中不存在的所有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 characters>Ord()255将以2-4个字符的序列显示,因此,如果逐字节读取utf-8文件,则必须知道是否处于多字节utf-8字符序列中。您可以在页面的注释中使用许多例程的实现


与其将它们复制到这里,我想敦促您确定它们中的哪一个吸引您来解决您的问题。

在我看来,您可能希望找到任何非ASCII字符,因为即使是“拉丁-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;
    }
}
for($i=0,$length=mbstrlen($string,'UTF-8');$i<$length;$i++){
$char=mb_substr($string,$i,1,'UTF-8');
如果(strlen($char)>1){
echo“找到了一个非ASCII字符:”、$char、(”、bin2hex($char)、“)”、PHP_EOL;
}
}

到目前为止,您尝试了哪些不起作用的方法?这不是一个代码编写服务。@Wooble我知道我不是那里的新用户。。。我不知道如何检查读取的字符是否为UTF-8格式。您说过整个文件的UTF-8格式正确。因此,根据定义,是的。所有字符都在UTF-8中。@Wooble你知道UTF-8中的“a”与ISO 8859-1中的“a”相同(二进制)吗?@AlexV你知道他基于基本逻辑是对的吗?您应该了解UTF8中的字符是如何编码的,这样您将获得一些信息(提示->位),ord PHP文档页面中的UTF8工作正常,但速度非常慢。相比之下,deceze的解决方案燃烧得很快。