【问题标题】:How to fix encoding while reading a CSV file?如何在读取 CSV 文件时修复编码?
【发布时间】:2013-09-11 12:27:21
【问题描述】:

我正在用 php 读取一个 CSV 文件,据我所知 - 这些文件可以有任何由 hoomans omg 发明的编码等等......我猜我有一个 MacRoman ANSI 编码的 CSV,我正在使用 Mac。

到目前为止,一切都很好(一点都不好,但那是另一个话题)。现在,在遍历这些行时,我有一个值:

Z�rich

显然,它应该是“Zürich” - 缺少“ü”..

现在,我几乎尝试了任何东西.. mb_detect_encoding 说“假”,所以他不明白它是什么...

然后我在这里找到了 Sebastian Grignoli 的天才班 -> Detect encoding and make everything UTF-8

看起来不错,但是……我得到的只是:

ZŸrich

不是我所期望的“ü”:D

现在我发现,“utf8_encode”会以某种方式工作,它会生成:

Z\u009Frich

但是.. 现在呢?如果我将它直接放入数据库,最终值为“Zrich”,这意味着它仍然不是真正的 UTF-8,或者数据库只是在与转义变体作斗争?当我对该值进行 mb_detect_encoding 时,他现在说“UTF-8”.. 很好.. 但我怎样才能走得更远?如何在 UTF-8 中以正确的方式获取“苏黎世”?

【问题讨论】:

  • 存储这些值的数据库列的编码是什么?
  • 建表时将字符集改为utf8
  • 在我的应用程序中,一切都是 utf-8,从表格到代码再到浏览器 - 一切......当我读取用户上传的文件时,就会出现这里的问题,它是由任何客户端计算机上的 MS Excel 创建的,因此,该文件可以在所有内容中进行编码,我无法控制:/(来源:stackoverflow.com/questions/508558/…)

标签: php csv encoding utf-8


【解决方案1】:

您可能可以使用iconv 进行转换。在我的安装中,MacRoman 编码被简单地称为"MAC":

$city = "Z\x9frich";
$city = iconv("MAC", "UTF-8", $city); 
echo $city; // Output: Zürich

【讨论】:

  • iconv 甚至能够直接将文本从 Z�rich 更正到 Zürich - 但是当 mb_detect_encoding 总是返回“false”时,你必须知道编码是相当困难的 -> 所以我自己写了检测这里描述的点赞:php.net/manual/de/function.mb-detect-encoding.php
  • 很难区分单字节编码,因为每个字节序列都是有效的,这与可变字节编码不同。如果您没有任何关于文本来源的信息,您将不得不根据字母或 n-gram 频率进行猜测。
  • 听起来很有趣,目前我已经实现了一种像 php doc cmets 中描述的疯狂猜测,但我必须用谷歌搜索你写的那些东西;)
【解决方案2】:

尝试先用 iconv 转换所有文件。稍后导入。 或者迭代每一行并使用 iconv 进行转换。

您必须知道文件的原始编码。

【讨论】:

    猜你喜欢
    • 2012-08-13
    • 1970-01-01
    • 2016-02-22
    • 2019-05-18
    • 2010-09-30
    • 2019-08-07
    • 1970-01-01
    • 2023-02-24
    相关资源
    最近更新 更多