获取文件的字符编码,而不需要将整个文件读入内存

6
我知道如果你需要在PHP中获取文件的字符编码,可以这样做:
var_dump (mb_detect_encoding (file_get_contents ("somefile.txt")));

然而,对于大文件来说这并不实用,因为它会占用大量内存。

有没有一种可靠的方法,在不必将整个文件读入内存的情况下确定字符编码呢?


2
从本质上讲,字符编码检测最多也只能达到不完美的程度。你可以轻松更改代码,仅读取最多65536个字节; 但不能保证剩余字节中没有会颠覆全局的信息。 - tripleee
1
在大多数情况下,64k应该足够了。如果你选择更小的尺寸,会增加误检测的风险。例如,一些文本文件中有一个超过8k的英文模板EULA头部,在ASCII字符之后的内容可能是任何语言,或者是多种语言的混合。 - tripleee
我一直在研究这个问题,使用file_get_contents可以从文件中获取部分内容,这样就不必加载整个文件。当然,正如tripleee所说,字符编码检测并不能保证它是正确的编码。 - Naruto
http://cs229.stanford.edu/proj2007/KimPark-AutomaticDetectionOfCharacterEncodingAndLanguages.pdf - rich remer
2个回答

0

不,没有办法在不读取整个文件的情况下可靠地确定字符编码。

原因:与 ASCII 不同的字符代码(仍然是许多编码的基本部分)在文件中是随机分布的。它们可能恰好都在您没有读取的部分。

当然,有些编码非常容易从开头识别,但这不是这里的问题。

(给您一个机会接受答案作为解决方案,尽管答案可能已经在评论中给出,这是您不应该做的(SO 政策)。)


-1

是的,您可以使用缓存, 您可以使用下面的函数来帮助您实现相同的功能

例如:

输出: string(6) "Hello " string(11) "Hello World"

更多的函数:

PHP_OUTPUT_HANDLER_CLEANABLE ob_clean()、ob_end_clean() 和 ob_get_clean()。 PHP_OUTPUT_HANDLER_FLUSHABLE ob_end_flush()、ob_flush() 和 ob_get_flush()。 PHP_OUTPUT_HANDLER_REMOVABLE ob_end_clean()、ob_end_flush() 和 ob_get_flush()。

有关更多信息,请访问:http://www.php.net/manual/en/function.ob-start.php


没有有意义地回答问题。 - GordonM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接