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

如果CSV包含日语字符,则PHP str_getcsv()无法正确解析CSV,php,csv,parsing,cjk,fgetcsv,Php,Csv,Parsing,Cjk,Fgetcsv,我正在尝试使用file()函数将excel文件转换为数组。某些字段包含日文字符。对于这些字段,我没有得到正确的数据 这是我的代码行 $data = array_map('str_getcsv', file($path)); 我只能猜测没有细节,比如输入的日语字母是如何被错误转换的 str_getcsv()可以看到系统区域设置,因此设置日语区域设置可能会解决此问题 此代码 setlocale(LC_ALL, 'ja_JP'); $data = array_map('str_getcsv', fi

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

这是我的代码行

$data = array_map('str_getcsv', file($path));

我只能猜测没有细节,比如输入的日语字母是如何被错误转换的

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的语言不可预测,则无法对其进行解析。另外,如果您的代码在不同的环境中使用,您还需要注意,定向区域设置可能会丢失。

我已经通过使用

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

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

您需要指定字符集头,与该文件中的编码相同。请给我举个例子,看看您的文件编码是否为UTF-8。我正在从外部导入csv或excel文件,如何将UTF-8添加到该文件中。请你解释一下好吗。这是我的代码:$path=$request->file('import_file')->getRealPath()$数据=数组映射('str_getcsv',文件($path));为什么你认为你得到了错误的数据?