获取大型csv的文件编码

时间:2018-08-13 20:07:46

标签: php csv encoding

我需要确定.csv文件内容的字符编码。

我见过的每个代码片段都使用file_get_contents(),但是我不能使用它,因为文件太大而无法存储在变量中(服务器内存已用尽)。

如何确定文件的字符编码?我可以先得到x个字符并检查一下吗?这样可以保证我的整个文件都是这种编码吗?

或者,我可以在不知道当前文件编码的情况下简单地将整个csv转换为UTF-8吗?

3 个答案:

答案 0 :(得分:1)

否,您不能仅使用前x个字符来确定编码。您可以猜测,但猜测可能是错误的。该文件可能是UTF-8,但x个字符前不包含UTF-8。如果可能包含与ASCII兼容的其他编码,则只能在字符x之后加上bot。

不,您不能在不知道当前文件编码的情况下转换文件。

答案 1 :(得分:0)

您可以使用iconv(http://php.net/manual/en/function.iconv.php#49434)直接进行转换,如您所说

答案 2 :(得分:0)

  

“请问,巴贝奇先生,如果您将错误的数字输入机器,会得出正确的答案吗?”我无法正确理解可能引起此类问题的那种混乱观念。

     

-查尔斯·巴贝奇(Charles Babbage),1864年。

您缺少元数据,并且建议输入值,无论它们是否正确。

只有作者/发送者可以通过一些标准,规范,约定,协议或通讯方式告诉您。通过HTTP传输数据时,常见的通信方法是Content-Type标头。

不幸的是,在我们的行业中,文本文件和流的元数据通信不足是很常见的。它起源于1970年代和80年代,当时文本文件在收到后便转换为本地字符编码。那不再适用,什么也没有真正取代。

不回答:

  • 从ISO-8859-1进行转换将永远不会失败,因为它使用任何顺序的所有256字节值。

  • 转换为任何当前Unicode编码(包括UTF-8)都不会失败,因为它们全部都支持整个Unicode字符集,并且Unicode包含了您今天可能会看到的每个计算机化字符。

    < / li>

但是,等等,对于CSV,还有更多需要的元数据:

  • 行尾(可以检测到)
  • 字段分隔符(可以检测到)
  • 报价方案,包括转义
  • 标题行的存在
  • 最后是每一列的数据类型。

请记住,如果您要猜测其中的任何一个,并且数据源是可更新的,那么今天的猜测明天可能就行不通了。