【问题标题】:How to support non-standard characters in PHP SplFileObject reading a CSV如何在读取 CSV 的 PHP SplFileObject 中支持非标准字符
【发布时间】:2014-08-24 15:06:52
【问题描述】:

我有一个读取 CSV 文件的简短脚本,如下所示:

$csv = new SplFileObject($pathToFile, 'r');

while (!$csv->eof() && ($row = $csv->fgetcsv()) && $row[0] !== null) {
    var_dump($row);
}

这工作正常,除了一些非标准字符有问题。 CSV中有一些德语单词,我的具体问题是变音符号有困难。它输出的行类型的示例是:

array(5) {
    [0]=>
        string(6) "J¦rgen"
    [1]=>
        string(8) "Lastname"
    [2]=>
        string(14) "name@domain.de"
    [3]=>
        string(7) "Example"
    [4]=>
        string(7) "Example"
}

Jürgen 中的 ü 被替换为 ¦ 字符。

我之前尝试过输入以下代码:

mb_internal_encoding('UTF-8');

但它没有任何效果。

在Vi中打开csv文件显示ü成功,说明文件在服务器上是正确的。

谁能建议 PHP 在解析 CSV 时如何成功处理德语字符?

【问题讨论】:

  • 为我工作。假设您在终端中执行它,您使用的是哪种终端编码?用浏览器试试。
  • 我从命令行运行它,但我做了一些调整以从浏览器运行,同样的事情发生了。 CSV 中的值被放入 MySQL 数据库表中,该表也没有变音字符。 (同一系统中的其他 PHP 脚本,其中数据来自 HTTP POST 而不是 CSV 文件,成功处理变音符号并将它们插入 MySQL 没有问题)。
  • 尝试使用iconv(在命令行上)将文件转换为utf-8。您需要先找出 csv 文件的输入编码是什么。为此,您需要查看生成 csv 的程序。如果这是不可能的,我最好的猜测是 windows-CP-1252
  • 我最初是通过 PuTTY 使用 UTF-8 运行它的。
  • 您手动编写了 csv?

标签: php csv splfileobject


【解决方案1】:

所示的代码本身应该可以工作。我猜这个问题是由 CSV 文件的字符编码引起的,这似乎不是utf-8。您需要找出输入文件的编码是什么。

一旦发现,您可以使用iconv 命令将文件转换为utf-8。 (在 cmets 中,您告诉输入编码是 iso-8859-1)。

例子:

iconv -f 'iso-8859-1' -t 'utf-8' input.csv > utf8.csv

注意!请不要尝试像这样直接覆盖文件:

iconv -f 'iso-8859-1' -t 'utf-8' data.csv > data.csv

这会覆盖(截断)data.csv 并导致数据完全丢失。这是因为 shell 在执行命令之前会创建并截断输出文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多