如何检测上传的csv文件的编码
Posted
技术标签:
【中文标题】如何检测上传的csv文件的编码【英文标题】:how to detect encoding of uploaded csv file 【发布时间】:2013-09-09 07:24: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,我检测不到。 谁能帮我解决这个问题?
【问题讨论】:
这是文本编码的固有问题。你不能总是正确地检测到它们,你只能在大多数时候猜测它们。除非有一些可用的元信息。 【参考方案1】:正如有人在 PHP 文档 here 中注意到的那样:
如果你尝试使用 mb_detect_encoding() 来检测一个字符串是否 有效的UTF-8,使用严格模式,否则一文不值。
所以你应该在检测编码时尝试使用true
参数:
mb_detect_encoding($str, mb_detect_order(), TRUE);
如果你可以预测一些可能的编码,你可以列出它们而不是使用mb_detect_order()
。
【讨论】:
mb_detect_encoding 并没有像您期望的那样工作。看来该函数只检查第一个字符,其余的被遗忘了,这会产生问题,因为假设您的文档在第 500 行有一个非 utf-8 字符;从 UTF-8 导入时会出现格式错误或丢失数据。 bugs.php.net/bug.php?id=72933 感谢这对我帮助很大!如果有人在几年后出现在这篇文章中,mb_detect_encoding 存在错误(请查看上面 Jame 的链接),如果只给出一个编码,请应用以下解决方案之一: 1. 重复 UTF-8 可达到预期结果,例如mb_detect_encoding($str, 'UTF-8, UTF-8') 2. 当您指定单一编码时,此任务的正确函数是“mb_check_encoding()”而不是“mb_detect_encoding()”。 3. 或者在mb_detec_encoding
函数的参数中使用mb_detect_order()
。 => 我使用选项 3(ISO-8859-1 或 UTF-8 输入文件),这样就可以了!以上是关于如何检测上传的csv文件的编码的主要内容,如果未能解决你的问题,请参考以下文章
如何从 csv 文件中获取数据并使用 mysql 保存到 grails 中?
如何查看csv文件的编码格式,我只能在用 wps的Excel 里打开 ?