UTF8转CP1255编码转换

3

我想将一个UTF-8字符串转换为CP1255(希伯来语)

我尝试运行以下代码(我使用detect_encoding,因为我的一些输入不是UTF-8):

foreach($param as $key=>$value){
    $newval = iconv(mb_detect_encoding($value),"cp1255",$value);
    $querystr .= $key."=".$newval."&";
}

无论如何,结果是所有希伯来字符都返回一个漂亮的“�”符号, 而其他所有字符(英文/数字)都按照预期和所需保持不变。 我该如何正确处理这个问题?

1
你确切地在哪里看到了“�”符号?你(双重/三重)检查过这个媒介是否支持cp1255编码吗?例如,在浏览器中检查页面属性,看看它是否真的切换到了希伯来语。 - VolkerK
在Chrome控制台中,进入“网络”选项卡,然后切换到“响应”选项卡(使用Ajax)。我还尝试对结果运行mb_detect_encoding,并得到了“UTF-8”。 - lior r
1
哦,ajax…既然如此,为什么不坚持使用utf-8呢?如果你查看XMLHttpRequest等W3C规范,你会发现到处都是“使用utf-8”、“始终使用utf-8”、“强烈建议使用utf-8”的字眼。 - VolkerK
1
我需要将数据发布到另一个只接受CP1255编码的服务器。 - lior r
1
是客户端/浏览器实际上将数据发布到第二个服务器吗?如果是,并且您正在使用<form>元素,请在第一个服务器上保持utf-8编码,并将其设置为<form action="//secondserver..." accept-charset="windows-1255">元素,以指示浏览器应该是cp1255编码。请参见http://www.w3.org/TR/html401/interact/forms.html#adef-accept-charset。 - VolkerK
我正在使用CURL将数据传输到服务器。基本上这里根本没有客户端涉及到。 - lior r
1个回答

6
我找到了一个解决方案:
foreach($param as $key=>$value){
    $value_encoding = mb_detect_encoding($value);
    if($value_encoding == "UTF-8"){
        $newval = iconv($value_encoding,"cp1255",$value);
    }else{
        $newval = $value;
    }
    $endpoint = add_query_arg($key,$newval,$endpoint);
}

$content = file_get_contents($endpoint);

mb_detect_encoding本身已经不是100%可靠的,对每个参数单独执行它并没有太多意义。 - Walter Tross

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