我用的是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);