【问题标题】:Problem when reading file with non-English characters in PHP在 PHP 中读取包含非英文字符的文件时出现问题
【发布时间】:2021-04-19 18:46:14
【问题描述】:

目前,我面临读取包含非英文字符的文件的问题。我需要使用以下代码逐行读取该文件:

while(!feof($handle)) {
   $line = fgets($handle);
}

这个文件有 1711 行,但奇怪的是,当我尝试遍历该文件时,它显示了 1766 行。

$text = file_get_contents($filePath);
$numOfLines = count(explode(PHP_EOL, $text));

如果有人能帮我解决这个问题,我将不胜感激。

【问题讨论】:

  • 1) 尝试将该文件缩小为更小的文件。 2)如果您仍然无法弄清楚,请在您的问题中分享那个较小的版本。

标签: php laravel file character-encoding


【解决方案1】:

您已经标记了“字符编码”,所以至少您知道问题的根源是什么。你有一些......可能......那里有UTF8字符,我敢打赌有些是多字节宽的。您通过在PHP_EOL 字符上爆炸来计算您的“线”,我猜它是0x0A。您的一些多字节宽字符包含0x0A 作为其“字符”的单个字节,因此explode(作用于字节而不是多字节字符)将其视为“行”的结尾。 var_dump你的分解数组,你会很容易看到问题。

试试count(mb_split('(\r?\n)', $text)),看看你会得到什么。我的正则表达式很差,这可能行不通。我会看到这个问题以获得更多关于您需要在新行上拆分的正则表达式的帮助:

Match linebreaks - \n or \r\n?

请记住,您的行尾可能是\u0085,但我怀疑它是因为PHP_EOL 激进了。

如果mb_split 有效,请记住您需要使用PHP 的mb_ 函数进行所有字符串操作。 PHP 的标准字符串函数采用单字节字符,并提供单独的 mb_ 函数来处理多字节宽字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    相关资源
    最近更新 更多