如果包含日语字符,PHP str_getcsv()无法正确解析CSV

问题描述 投票:1回答:2

我试图使用file()函数将excel文件转换为数组。有些字段包含日文字符。对于那些领域,我没有得到正确的数据。

这是我的代码行

$data = array_map('str_getcsv', file($path));
php csv parsing cjk fgetcsv
2个回答
2
投票

我只能在没有细节的情况下猜测,比如输入日文字母是如何错误转换的。

str_getcsv()看到系统区域设置,因此设置日语区域设置可能会解决问题。

这段代码

setlocale(LC_ALL, 'ja_JP');
$data = array_map('str_getcsv', file('japanese.csv'));
var_dump($data);

在我的本地使用以下CSV文件(japanese.csv,以UTF-8保存)。

日本語,テスト,ファイル
2行目,CSV形式,エンコードUTF-8

结果是

array(2) {
  [0]=>
  array(3) {
    [0]=>
    string(9) "日本語"
    [1]=>
    string(9) "テスト"
    [2]=>
    string(12) "ファイル"
  }
  [1]=>
  array(3) {
    [0]=>
    string(7) "2行目"
    [1]=>
    string(9) "CSV形式"
    [2]=>
    string(20) "エンコードUTF-8"
  }
}

如您所见,str_getcsv()要求您知道输入CSV文件中使用的语言类型。这次您可能确定输入始终是日语,但如果语言不可预测,则无法解析CSV。此外,如果您的代码在不同的环境中使用,则需要注意定向的语言环境可能会丢失。


1
投票

我通过使用解决了这个问题

mb_convert_encoding($csv_data[$i][2],"UTF-8", "SJIS");

这会将所有Shift-JIS编码的字符转换为UTF-8。

© www.soinside.com 2019 - 2024. All rights reserved.