在PHP中读取部分文件时的多字节指针


Multibyte pointer when reading part of a file in PHP

我用的是PHP

下面的函数加载一个大的多字节输入分隔的CSV文件的一部分,并返回一个数组中的pointer(结束位置)和content。与pointer我可以以后做另一个运行。工作原理:

function part($path, $offset, $rows) {
    $buffer = array();
    $buffer['content'] = '';
    $buffer['pointer'] = array();
    $handle = fopen($path, "r");
    fseek($handle, $offset);
    if( $handle ) {
        for( $i = 0; $i < $rows; $i++ ) {
            $buffer['content'] .= fgets($handle);
            $buffer['pointer'] = mb_strlen($buffer['content']);
        }
    }
    fclose($handle);
    return($buffer);
}
// Buffer first part
$buffer = part($path_to_file, 0, 100);
// Buffer second part
$buffer = part($path_to_file, $buffer['pointer'], 100);
print_r($buffer);

如果我将$buffer['pointer']行更改为:

$buffer['pointer'] = mb_strlen($buffer['content'], "UTF-8");

…它不再工作了……我知道当我使用UTF-8而不是默认编码时,它使用不同的编码,但是为什么它不能与UTF-8一起工作?

UTF-8不应该与外部字符兼容吗?

因为上面的函数在没有"UTF-8"的情况下可以工作,所以我想我可以不使用UTF-8而使用它。

我仍然担心,在某些情况下,它可以给错误的指针?

是否有更安全的方法来获得正确的指针?

编码测试

当我这样做时,我得到UTF-8:

echo mb_detect_encoding($buffer['content']);

这与UTF-8没有什么关系。文件系统函数(如fseek()fread()等)对单个字节进行操作。它们根本不关心编码。(你可以写/读二进制数据)。

如果你想保存一个指向fseek()的指针,在以后的时间,使用ftell()找到当前的位置:

$buffer['pointer'] = ftell($handle);