我使用 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(
我实际上需要这个结果:
מידע למקבל בזק החברה הישראלית אין
如果我尝试图标:
echo iconv("WINDOWS-1255", "UTF-8", "îéãò ìî÷áì áæ÷ äçáøä äéùøàìéú àéï ");
我明白这个:
ֳ®ֳ©ֳ£ֳ² ֳ¬ֳ®ֳ·ֳ¡ֳ¬ ֳ¡ֳ¦ֳ· ֳ₪ֳ§ֳ¡ֳ¸ֳ₪ ֳ₪ֳ©ֳ¹ֳ¸ֳ ֳ¬ֳ©ֳ÷ ֳ ֳ©ֳ¯
这是怎么回事?如何获得希伯来语结果?
谢谢!!
当您有包含以下内容的文件时:
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(。
可能不需要重新编码。您可以简单地使用声明的 win-1255 编码提供相同的内容,并让浏览器处理它。
如果要重新编码,则需要在服务器上进行,如下所示:
- 从远程服务器获取字符串。
- 确定字符串的编码(来自 http 标头或 html 标头(。
- 如有必要,将编码转换为 utf-8。
- 使用正确的 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');