如何使用 PHP 列出不属于 ISO 8859-1 字符集的文本文件中使用的所有 UTF-8 字符?

Posted

技术标签:

【中文标题】如何使用 PHP 列出不属于 ISO 8859-1 字符集的文本文件中使用的所有 UTF-8 字符?【英文标题】: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? 【发布时间】:2013-12-21 09:55:22 【问题描述】:

我有一个以 UTF-8 格式保存的大 (900+ MB) SQL(文本)文件。文件内容有效且仅为 UTF-8(无双重编码或错误字符集)。

我想解析此文件以查找此文件中使用的不属于 ISO 8859-1 字符集的所有 UTF-8 字符。如您所知,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);

【问题讨论】:

到目前为止,您尝试了哪些不起作用的方法? SO 不是代码编写服务。 @Wooble 我知道我不是那里的新用户...我不知道如何检查读取的字符是否为 UTF-8。 您说整个文件是正确的 UTF-8。所以,根据定义,是的。所有字符都是 UTF-8。 @Wooble 您知道 UTF-8 中的“a”与 ISO 8859-1 中的“a”相同(二进制)吗? @AlexV 你知道根据基本逻辑他是对的吗?你应该阅读 UTF8 中的字符是如何编码的,这样你就会得到一些启示(提示 -> 位) 【参考方案1】:

在我看来,您希望找到任何 非 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;
    

【讨论】:

【参考方案2】:

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

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

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

与其在此处复制它们,我会敦促您确定其中哪些吸引您来解决您的问题。

【讨论】:

ordutf8 in ord PHP 文档页面可以工作,但速度非常慢。相比之下,deceze 的解决方案非常快。

以上是关于如何使用 PHP 列出不属于 ISO 8859-1 字符集的文本文件中使用的所有 UTF-8 字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何将汉字转换为iso-8859-1的字符串 - PHP进阶讨论

如何使用正确的字符编码在 jQueryMobile 1.3.1 中通过 AJAX 加载 ISO-8859-1 内容?

如何使用 iso_8859-1 在 C 程序中输出度数符号?

smarty 在 php 7.2 和德语变音符号上替换 ans ISO-8859-1 的问题

如何使用 Flex 在 ISO-8859-1 中发送 SOAP 请求?

java接入易宝支付时,商品名称为UTF-8编码的中文,如何转换成GBK编码的中文