通过json_encode传递日文字符(UTF-8)的问题

时间:2010-01-06 16:17:10

标签: php utf-8 character-encoding json

我无法通过json_encode将日语字符从PHP传输到JavaScript。

以下是从csv文件中读取的原始数据。

PRODUCT1,QA,テスト
PRODUCT2,QA,aテスト
PRODUCT3,QA,1テスト

问题是当通过echo json_encode($ return_value)传递这些数据时,其中$ return_value是包含上述数据的二维数组,日语单词'テスト'被删除并在ajax响应端显示为空字符串。但是,如果我在日语单词的开头添加任何字母/数字字符,例如上面例子的第2行和第3行的“aテスト”或“1テスト”,那些单词就可以通过了。

以下是ajax响应方面的数据。如您所见,第1个块的第3个元素为空。如果我从上述原始数据的其他单词中删除“a”或“1”,那么这些字符在响应方也会变空。这种情况发生在我迄今为止测试过的任何日文字符中。

[["PRODUCT1","QA",""],["PRODUCT2","QA","a\u30c6\u30b9\u30c8"],["PRODUCT3","QA","1\u30c6\u30b9\u30c8"]]

有没有人知道为什么会这样,以及我如何克服这个问题?

这是每一方代码的一部分。

 PHP:
 function getFileContents($dirName,$filename){

    $return_value = array();
    $my_file= fopen($dirName . $filename, "r");

    $row = 0;
    while (($data = fgetcsv($my_file, 1000, ",")) !== FALSE) {
        $num = count($data);
         for ($c=0; $c < $num; $c++) {
            #csv file is written in euc-jp so convert to utf-8 here.
            $return_value[$row][$c] = mb_convert_encoding($data[$c], "UTF-8", "EUC-JP");
         }
         $row++;
    } 
    fclose($my_file);

    echo json_encode($return_value);
  }

  JavaScript:
  $.ajax({
     type: "POST",
     url: "data.php",
     data: { 
        "dirName" : "./data/",
        "filename" : filename
     },
     dataType :"json",
     success : function(response){
          // more code
          // At this point, Japanese characters are already empty strings.
    } 
  });

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我发现问题是PHP fgetcsv()函数无法识别EUC-JP中的字符。显然,fgetcsv() uses the system locale setting to make assumptions about character encoding。我在执行fgetcsv()之前添加了下面的行,如引用的示例所示(但是以相反的方式),它修复了问题!

setlocale(LC_ALL, 'ja_JP.EUC-JP');