Php如何将unicode转换为俄语chacrters

时间:2016-10-14 06:55:21

标签: php unicode

这是我的字符串

запретнаÑ-зона

转换它会给出

запретная-зона

我如何使用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

无论如何要解决这个问题?我在哪里做错了?

2 个答案:

答案 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)是俄语的有效编码。