PHP CURL 日语输出乱码问题

5
考虑以下URL: 点击此处 存在一些日语字符的编码。 我的PC上的Firefox浏览器能够自动检测并显示这些字符。 另一方面,对于Chrome,我必须手动更改编码为“Shift_JIS”才能看到日语字符。
如果我尝试通过PHP-cURL访问内容,则编码文本会出现乱码,如下所示:
���ϕi�̂��ƂȂ��I�݂��Ȃ̃N�`�R�~�T�C�g�������������i�A�b�g�R�X���j�ɂ��܂����I
我尝试过:
  curl_setopt($ch, CURLOPT_ENCODING, 'Shift_JIS');

我尝试过(在下载curl响应后)执行以下操作:
  $output_str = mb_convert_encoding($curl_response, 'Shift_JIS', 'auto');
  $output_str = mb_convert_encoding($curl_response, 'SJIS', 'auto');

但这也不起作用。
以下是完整代码:
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language: en-US,en;q=0.5',
        'Connection: keep-alive'
    ));

    //curl_setopt($ch, CURLOPT_ENCODING, 'SJIS');
    curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $response = curl_exec($ch);

它可能被压缩了吗?https://dev59.com/qnVC5IYBdhLWcg3wYQEp - JimL
可能是什么问题。如何在cURL中处理它? - hvs
这个问题在我提供的链接页面上有解释。 - JimL
不幸的是,情况并非如此。 - hvs
这个怎么样:http://stackoverflow.com/questions/9447601/curl-get-utf-8-data-from-site-with-incorrect-charset - Dimitrios Desyllas
2个回答

6

该页面并非有效的HTML,而是Javascript。如果您使用curl获取它并输出它,请在您的代码中添加 header('Content-type:text / html; charset = shift_jis');,当您在Chrome中加载它时,字符将正确显示。

由于HTML未指定字符集,您可以使用header()从服务器指定字符集。

要实际转换编码以便在终端上正确显示,您可以尝试以下操作:

使用iconv()转换为UTF-8

$curl_response = iconv('shift-jis', 'utf-8', $curl_response);

使用mb_convert_encoding()将文本转换为UTF-8编码

$curl_response = mb_convert_encoding($curl_response, 'utf-8', 'shift-jis');

这两种方法都适用于我,我能够在终端上正确显示日文字符。

UTF-8 应该没问题,但如果你知道你的系统使用了其他编码方式,可以尝试使用其他编码。

希望这有所帮助。


我正在尝试通过php脚本访问日语字符。我不能使用浏览器。这可能吗? - hvs
@hvs 只需使用 iconv() 方法即可。我刚测试过,完全正常。您可以在普通的 PHP 脚本中使用它,而不是网页。 - Anonymous
1
@hvs,mb_convert_encoding() 也可以工作。在您的原始代码中,您对其使用了错误的参数顺序。请参见 http://php.net/manual/en/function.mb-convert-encoding.php。 - Ivan Yarych
抱歉回复晚了。我被其他事情占据了,而且实话实说,等待了这么长时间后我并没有期望得到答案。你的 mb_convert_encoding 建议很有效!非常感谢。 - hvs

0
以下代码将在浏览器中正确输出日语字符:-
<?php

// create a new cURL resource
$ch = curl_init();

// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, $setUrlHere);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

// grab URL content
$response = curl_exec($ch);

// close cURL resource, and free up system resources
curl_close($ch);

header('Content-type: text/html; charset=shift_jis');
echo $response;

无法使用浏览器,因为它是在服务器上运行的 PHP 脚本,并直接写入数据库。 - hvs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接