Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中读取部分文件时的多字节指针_Php_String_File_Pointers_Utf 8 - Fatal编程技术网

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

在PHP中读取部分文件时的多字节指针,php,string,file,pointers,utf-8,Php,String,File,Pointers,Utf 8,我使用PHP 下面的函数加载一个大的多字节输入分隔CSV文件的一部分,并返回一个指针(结束位置)和数组中的内容。使用指针我可以稍后再运行一次。它的工作原理是: function part($path, $offset, $rows) { $buffer = array(); $buffer['content'] = ''; $buffer['pointer'] = array(); $handle = fopen($path, "r"); fseek($h

我使用PHP

下面的函数加载一个大的多字节输入分隔CSV文件的一部分,并返回一个
指针(结束位置)和数组中的
内容。使用
指针
我可以稍后再运行一次。它的工作原理是:

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);
…它不再工作了。。。我知道当我使用UTF-8而不是默认值时,它使用了不同的编码,但是为什么它不能使用UTF-8呢

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

因为上面的函数在我不使用“UTF-8”的情况下可以工作,所以我想我可以不使用UTF-8

我仍然担心在某些情况下它会给出错误的指针?

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

编码测试 当我这样做时,我得到了
UTF-8

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

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

如果要在以后存储指向
fseek()
to的指针,请使用查找当前位置:

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

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

如果要在以后存储指向
fseek()
to的指针,请使用查找当前位置:

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

我尝试了
ftell
,但没有成功。我又一次用错了指针。到目前为止,唯一有效的方法是
$this->pointer+=mb_strlen($this->content)ftell
,但没有成功。我又一次用错了指针。到目前为止,唯一有效的方法是
$this->pointer+=mb_strlen($this->content)