【问题标题】:php curl japanese output garbledphp curl 日文输出乱码
【发布时间】:2016-03-15 18:54:25
【问题描述】:

考虑以下网址: click here

日文字符有一些编码。我电脑上的 Firefox 浏览器能够自动检测并显示字符。另一方面,对于 Chrome,我必须手动将编码更改为“Shift_JIS”才能看到日文字符。

如果我尝试通过 PHP-cURL 访问内容,编码的文本会出现这样的乱码

����ϕi�̂��ƂȂ��I�����������N�`�R�~�T�C���������������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);

【问题讨论】:

标签: php curl character-encoding


【解决方案1】:

该页面没有返回有效的 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 只需使用iconv() 方法。我刚刚测试了它,工作正常。您可以在常规 PHP 脚本而不是网页中使用它。
  • @hvs, mb_convert_encoding() 应该也可以。在您的原始代码中,您使用了不正确的参数顺序。见php.net/manual/en/function.mb-convert-encoding.php
  • 您好,很抱歉这么晚才回复您。我被其他事情所困扰,坦率地说,在等待了很长时间后,我并没有期待答案。您的 mb_convert_encoding 建议有效!非常感谢。
【解决方案2】:

以下代码将在浏览器中正确输出日文字符:-

<?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 脚本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 2016-12-16
相关资源
最近更新 更多