将ajax响应从windows-1255转换为UTF8

时间:2012-05-01 16:09:06

标签: php ajax character-encoding

我使用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", "îéãò ìî÷áì  áæ÷ äçáøä äéùøàìéú àéï  ");

我明白了:

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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您有包含此内容的文件:

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。

答案 1 :(得分:1)

可能没有必要重新编码。您可以使用声明的win-1255编码来提供相同的内容,并让浏览器处理它。

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

  1. 从远程服务器获取字符串。
  2. 确定字符串的编码(来自http标头或html标头)。
  3. 如有必要,将编码转换为utf-8。
  4. 使用正确的utf-8编码声明将新值返回给客户端。
  5. 您可能在步骤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');
    
相关问题