【问题标题】:Multibyte pointer when reading part of a file in PHP在 PHP 中读取部分文件时的多字节指针
【发布时间】:2017-02-05 01:47:51
【问题描述】:

我使用 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']);

【问题讨论】:

    标签: php string file pointers utf-8


    【解决方案1】:

    这与 UTF-8 关系不大。文件系统函数(如fseek()、fread() 等)对单个字节进行操作。他们根本不关心编码。 (您可能正在写入/读取二进制数据)。

    如果您想稍后存储指向fseek() 的指针,请使用ftell() 找出当前位置:

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

    【讨论】:

    • 我尝试了ftell,但没有成功。我最终又用错了指针。到目前为止,唯一有效的是$this-&gt;pointer += mb_strlen($this-&gt;content);,但我很难接受我不明白的事情。
    • ShiraiNai7 是正确的。如果您在使用 ftell() 时遇到问题,那么您的代码是错误的。在累积的数据上反复使用 strlen 来测量它的大小是可怕的。
    • @symcbean 是的,我现在同意你的看法。好像我做错了什么。我重写了它,它确实有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多