如何检测上传的CSV文件的编码

10

我有一个名为data.csv的文件,必须上传到服务器并解析...

这个文件可以有不同的编码格式。我必须检测它并转换为utf8。

目前,php函数mb_detect_encoding总是返回utf8。 我尝试了:

<?php 
mb_detect_encoding(file_get_contents($_FILES["csv_uploadfile"]["tmp_name"]));
或者
<?php 
mb_detect_encoding(file_get_contents($saved_file_path));

mb_detect_encoding返回utf8。

如果我使用bash命令

$ file -bi csv_import_1378376486.csv |awk -F "=" '{print $2}'

它返回 iso-8859-1

因此当我尝试时

iconv --from-code=iso-8859-1 --to-code=utf-8 csv_import_1378382527.csv 

它不可读。

真正的编码是cp1251,但我无法检测到。 有人能帮我解决这个问题吗?


5
这是文本编码的固有问题。你不能总是正确地检测它们,大多数情况下只能猜测。除非有一些元信息可用。 - scai
1个回答

10

有人在PHP文档这里注意到:

如果您尝试使用mb_detect_encoding()检测字符串是否有效的UTF-8,请使用strict模式,否则它几乎毫无用处。

因此,在检测编码时应尝试使用true参数:

mb_detect_encoding($str, mb_detect_order(), TRUE);

如果您能预测可能的编码方式,可以将它们列出来,而不是使用 mb_detect_order()

mb_detect_encoding并不像你期望的那样有效。该函数似乎只检查第一个字符,而忽略了其余部分,这会导致问题,因为假设你有一个文档,在第500行有一个非UTF-8字符;当从UTF-8导入时,它将变得格式不正确或缺少数据。https://bugs.php.net/bug.php?id=72933 - James
1
谢谢,这对我很有帮助!如果有人在几年后看到这篇文章,那么请注意 mb_detect_encoding 存在一个 bug(请参考上面 James 的链接),如果只给出单个编码,则可以采用以下解决方案之一:
  1. 重复使用 UTF-8 可以达到预期的结果,例如:mb_detect_encoding($str, 'UTF-8, UTF-8')
  2. 当您指定单个编码时,正确的函数是 "mb_check_encoding()" 而不是 "mb_detect_encoding()"。
  3. 或者在 mb_detect_encoding 函数的参数中使用 mb_detect_order()。 => 我使用选项 3(ISO-8859-1 或 UTF-8 输入文件),这样就可以完成工作了!
- pti_jul

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