如何在PHP中使用日语字符代码导出.csv文件?

时间:2019-05-17 07:32:43

标签: php laravel

我正在尝试使用laravel和php创建一个csv文件。用于创建csv的数据库包含日语字符,我希望它们在文件中看起来完全相同。

下面是我到目前为止尝试过的代码,但是日语字符仍然显示为符号。

$headers = array(
    "Content-Encoding" => "sjis-win",
    "Content-type" => "text/csv; charset=sjis-win",
    "Content-Disposition" => "attachment; filename=User-List.csv",
    "Pragma" => "no-cache",
    "Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
    "Expires" => "0"
);


$users= $this->users->orderBy('created_at', 'desc')->get();
$columns = array('氏名', '氏名(ローマ字)');

$callback = function() use ($users, $columns)
{
    $file = fopen('php://output', 'w');
    fputcsv($file, $columns);

    foreach($users as $user) {
        fputcsv($file, array($user->name, $user->name_alphabet));
    }
    fclose($file);
};

我想念什么?需要进行哪些更改才能使字符在csv中自动显示为日语。

1 个答案:

答案 0 :(得分:1)

由于您从数据库中检索的数据是用 UTF-8 编码的,因此您需要重新编码该数据以匹配CSV文件的编码(SJIS-win)。

您可以使用php的mb_convert_encoding()函数来实现此目的。

mb_convert_encoding($dataVariable, "SJIS-win", "UTF-8");

在您的情况下,您可以按以下方式使用它:

foreach($users as $user) {
    fputcsv($file, array(
        mb_convert_encoding($user->name, "SJIS-win", "UTF-8"), 
        mb_convert_encoding($user->name_alphabet, "SJIS-win", "UTF-8")
    ));
}

您可能还需要在$columns = array('氏名', '氏名(ローマ字)')数组中重新编码字符串。