【问题标题】:converting ajax response from windows-1255 to UTF8将 ajax 响应从 windows-1255 转换为 UTF8
【发布时间】:2012-05-01 16:09:05
【问题描述】:

我使用 Ajax 调用来接收希伯来语的响应。结果来自不同的站点,并采用windows-1255 编码。我的页面是UTF-8。 响应如下所示:

îéãò ìî÷áì  áæ÷ äçáøä äéùøàìéú  àéï 

我找到了这个网站:http://kanjidict.stc.cx/recode.php 使用 windows-1255 到 UTF-8(+标记最后一个复选框),结果是完美的。 问题是我如何在 PHP 上做到这一点?

我所做的一切都会导致垃圾。

$data = 'îéãò ìî÷áì  áæ÷ äçáøä äéùøàìéú àéï  ';
echo mb_detect_encoding($data);

导致UTF-8(可能真的是UTF-8,因为我的php文件是utf-8)

我确实需要这个结果:

מידע למקבל  בזק החברה הישראלית אין 

如果我尝试 iconv:

echo iconv("WINDOWS-1255", "UTF-8", "îéãò ìî÷áì  áæ÷ äçáøä äéùøàìéú àéï  ");

我明白了:

ֳ®ֳ©ֳ£ֳ² ֳ¬ֳ®ֳ·ֳ¡ֳ¬ ֳ¡ֳ¦ֳ· ֳ₪ֳ§ֳ¡ֳ¸ֳ₪ ֳ₪ֳ©ֳ¹ֳ¸ֳ ֳ¬ֳ©ֳ÷ ֳ ֳ©ֳ¯ 

发生了什么事?我怎样才能得到希伯来语结果?

谢谢!!

【问题讨论】:

  • 我很困惑。您使用 Ajax(即来自客户端 JavaScript 的 XMLHTTPRequest)还是 PHP 来获取该页面?能否展示一下您目前使用的 PHP 代码?
  • 我使用 jQuery $.get 调用一个 php 页面,该页面又使用 cURL 从另一个使用 windows-1255 编码的页面中获取数据
  • 所以 Ajax 部分暂时是无关紧要的。请出示您的curl 代码。
  • converting ajax response from ISO-8859-1 to UTF8 的可能重复项 - Ted,请不要重复问题,而是改进之前的问题。

标签: php ajax character-encoding


【解决方案1】:

当您拥有包含此内容的文件时:

echo iconv("WINDOWS-1255", "UTF-8", "îéãò ìî÷áì  áæ÷ äçáøä äéùøàìéú àéï  ");

保存文件本身的编码方式非常重要。 PHP 的字符串不关心编码,它们只是作为字节数组工作。所以如果你使用 UTF-8 编码保存这样的文件,字符串当然会保存为 UTF-8,iconv 无法从 WIN1255 转换它,因为它是 UTF-8。

我的建议是 1) 从服务器检索原始编码中的字符串 2) 将其保存到文件中 3) 使用该文件进行实验,因为这样您就可以确定您只处理数据它是。一旦您尝试将其复制并粘贴到某个地方,您可能会更改事物的编码。

另外,使用十六进制编辑器查看数据也不错,这样您就可以确定文件中存储的内容。

无论如何,您所说的尝试做的似乎是正确的:从服务器获取 WIN-1255 数据,然后在其上调用 iconv(...),现在它是 UTF-8,将其输出到 HTML 页面(其中当然有一个<meta>,表示它是UTF-8)。

【讨论】:

    【解决方案2】:

    可能不需要重新编码。您可以简单地使用声明的 win-1255 编码提供相同的内容,并让浏览器处理它。

    如果你想重新编码,你需要在服务器上这样做:

    1. 从远程服务器获取字符串。
    2. 确定字符串的编码(从 http 标头或 html 标头)。
    3. 如有必要,将编码转换为 utf-8。
    4. 使用正确的 utf-8 编码声明向客户端返回新值。

    您可能在第 4 步中缺少 Content-Type: text/html;charset=utf8 标头,这就是您的 echo iconv(...) 看起来错误的原因。

    这是一个示例函数,可以在常见情况下为您执行步骤 1-3:

    function getUrlAsUtf8($url) {
        $s = file_get_contents($url);
        if ($s) {
            $contenttype = preg_grep('/content-type:(?:(?:\r\n)?[ \t]+)*+((?:(?:(?:\r\n)[ \t]+)|[ \t\x20-\x7e\x80-\xff])*)/i', $http_response_header);
            $inputcharset = null;
            foreach ($contenttype as $ct) {
                if (preg_match('/charset\s*=\s*(.*?)(?:$|;)/i', $ct, $matches)) {
                    $inputcharset = strtolower($matches[1]);
                }
            }
            if ($inputcharset and $inputcharset!=='utf-8') {
                $s = mb_convert_encoding($s, 'utf-8', $inputcharset);
            }
        }
        return $s;
    }
    
    echo getUrlAsUtf8('http://example.org');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      相关资源
      最近更新 更多