我有一个以UTF-8保存的大(900+ MB)SQL(文本)文件。该文件的内容是有效的,只有UTF-8(没有双重编码或错误的字符集)。
我想解析此文件以查找此文件中使用的所有UTF-8字符,这些字符不属于ISO 8859-1字符集。如您所知,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);
答案 0 :(得分:1)
这真的不是一个复杂的问题。
你基本上想要一个用于utf8的Ord()。 utf8中的Ascii字符具有序数值< 127.
然而,utf-8字符> Ord()255将包含2-4个字符序列,因此,如果逐字节读取utf-8文件,则必须知道您是否处于多字节utf-8字符序列中。您可以在http://php.net/ord页面的注释中使用许多例程实现。
我建议您不要将它们复制到这里,而是要求您确定哪些内容可以帮助您解决问题。
答案 1 :(得分:1)
在我看来,你想要找到任何非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;
}
}