PHP:为什么iconv中的任何非拉丁字符给我“非法字符”错误?

时间:2015-04-09 21:27:23

标签: php unicode iconv

例如:

$text = "пд";
echo 'Plain    : ', iconv("UTF-8", "us-ascii//TRANSLIT", $text), PHP_EOL;

输出

Plain :
Notice: iconv() [function.iconv]: Detected an illegal character in input string in ...

我尝试添加

setlocale(LC_CTYPE, 'en_US.UTF8');

但没关系...

1 个答案:

答案 0 :(得分:0)

您需要确保源文件实际上是以UTF-8保存的,而不是Windows-1251。否则这些字符将不代表有效的UTF-8序列。

<强>更新

是的,iconv // TRANSLATE似乎依赖于语言环境。如果将其设置为 source 语言区域设置,它可能会正常工作。所以在你的例子中,我猜这是一些西里尔语的语言环境,但不是'en_US'。

但事实上,如果你只需要一种语言的音译,那么自己创建一个简单的翻译表会更可靠:

$trans = [
    'а' => 'a',
    'д' => 'd',
    'п' => 'p',
    ...
];
$translit = str_replace(array_keys($trans), array_values($trans), $source_string);

但如果你需要它适用于所有/未知语言,你将不得不使用更复杂的东西,例如http://php.net/manual/en/class.transliterator.php