【问题标题】:How to specify encoding while process csv file in PHP?如何在 PHP 中处理 csv 文件时指定编码?
【发布时间】:2010-01-12 10:57:20
【问题描述】:
<?php
$row = 1;
$handle = fopen ("test.csv","r");
while ($data = fgetcsv ($handle, 1000, ",")) {
    $num = count ($data);
    print "<p> $num fields in line $row: <br>\n";
    $row++;
    for ($c=0; $c < $num; $c++) {
        print $data[$c] . "<br>\n";
    }
}
fclose ($handle);
?> 

以上来自php手册,但我没有看到在哪里指定编码(比如utf8左右)

【问题讨论】:

    标签: php fgetcsv


    【解决方案1】:

    尝试更改语言环境。

    就像它在您提供的manual 中的示例下面所说的那样:

    注意:此功能会考虑区域设置。如果 LANG 是例如en_US.UTF-8, 此函数读取单字节编码的文件错误。

    Suggested approach by comment on the same page:

    setlocale(LC_ALL, 'ja_JP.UTF8'); // for japanese locale
    

    来自setlocale()

    区域名称可以在RFC 1766ISO 639 中找到。不同的系统有 不同的语言环境命名方案。 [...] 在 Windows 上,setlocale(LC_ALL, '') 设置 来自系统区域/语言设置的区域名称(可通过控制面板访问)。

    【讨论】:

      【解决方案2】:

      这样的事情之一是 UTF 字节顺序标记或 BOM 的出现。字节顺序标记的 UTF-8 字符是 U+FEFF,或者更确切地说是三个字节——0xef、0xbb 和 0xbf——位于文本文件的开头。对于 UTF-16,它用于指示字节顺序。对于 UTF-8 来说,这并不是必需的。

      所以你需要检测这三个字节并移除 BOM。下面是一个关于如何检测和删除三个字节的简化示例。

      $str = file_get_contents('file.utf8.csv');
      $bom = pack("CCC", 0xef, 0xbb, 0xbf);
      if (0 == strncmp($str, $bom, 3)) {
          echo "BOM detected - file is UTF-8\n";
          $str = substr($str, 3);
      }
      

      就是这样

      【讨论】:

        【解决方案3】:

        试试这个:

        <?php
        $handle = fopen ("specialchars.csv","r");
        echo '<table border="1"><tr><td>First name</td><td>Last name</td></tr><tr>';
        while ($data = fgetcsv ($handle, 1000, ";")) {
                $data = array_map("utf8_encode", $data); //added
                $num = count ($data);
                for ($c=0; $c < $num; $c++) {
                    // output data
                    echo "<td>$data[$c]</td>";
                }
                echo "</tr><tr>";
        }
        ?>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-05
          相关资源
          最近更新 更多