这是我的字符串
запретнаÑ-зона
转换它会给出
запретная-зона
我如何使用PHP转换?我尝试了其他Unicode转换答案..但没有一个工作
我根据答案尝试过......请看结果......
$my_str = "/запретнаÑ-зона-chernobyl-diaries-20-q38685478.html";
$encoded = iconv("Windows-1252", "UTF-8//IGNORE", $my_str);
echo $encoded;
echo "<br>";
echo mb_convert_encoding($my_str, "Windows-1252", "UTF-8");
以下是结果......
/÷ðÿрõтýðÑ-÷þýð-chernobyl-diaries-20-q38685478.html
/?????????-????-chernobyl-diaries-20-q38685478.html
无论如何要解决这个问题?我在哪里做错了?
答案 0 :(得分:2)
由于Universal Cyrillic decoder
表示您的字符串是以UTF-8编码的,因此自动解密表明您的原始字符串是Windows-1252
编码的,因此返回转换就足以返回俄语字符。
$s = "запретнаÑ-зона";
iconv("UTF-8", "Windows-1252", $s), PHP_EOL;
否则你可以使用这个方法
mb_convert_encoding($s, "Windows-1252", "UTF-8");
结果:
запретна�-зона
答案 1 :(得分:0)
如上所述,字符串запретнаÑ-зона
确实看起来像在Windows-1252中编码的UTF-8字符串запретная-зона
:
$s = 'запретная-зона';
$encoded = iconv("Windows-1252", "UTF-8//IGNORE", $s);
echo $encoded, PHP_EOL;
// Outputs: запретнаÑ-зона
请注意,我们忽略了使用//IGNORE
的无效序列,否则会忽略
转换是不可能的:
$s = 'запретная-зона';
$encoded = iconv("Windows-1252", "UTF-8", $s);
var_dump($encoded);
此代码失败:
Notice: iconv(): Detected an illegal character in input string in /home/ruslan/tmp/1.php on line 3
bool(false)
正如我们所见,从UTF-8到Windows-1252的转换是有损的 - 我们可以转换一些字符,但必须忽略一些字符。否则,转换失败。
显然,如果我们尝试将$encoded
字符串解码回UTF-8,某些字符将被破坏:
echo iconv("UTF-8", "Windows-1252//IGNORE", $encoded), PHP_EOL;
// Outputs: запретна�-зона
因此,您需要使用俄语字符集正确编码原始文本。只有拥有原始版本,您才能将其转换为UTF-8(并再次返回)。
我猜,你看到Windows-1252中编码的字符串只是因为某些自动转换,例如浏览器的字符集自动检测,而原始文本是以不同的编码编码的。这就是了解字符串来源(文本文件,数据库等)的重要信息。我不能给出更好的答案,因为你没有把这些细节放到这个问题中。但想法是将转换应用于原始字节流。例如:
$text = file_get_contents('/tmp/file-in-windows-1251.txt');
echo iconv('Windows-1251', 'UTF-8', $text), PHP_EOL;
注意,Windows-1251(不是Windows-1252)是俄语的有效编码。