【问题标题】:PHP: Why any non-latin char in iconv gives me "illegal character" error?PHP:为什么 iconv 中的任何非拉丁字符都会给我“非法字符”错误?
【发布时间】:2015-04-09 21:27:23
【问题描述】:

例如:

$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');

不过没关系……

【问题讨论】:

    标签: php unicode iconv


    【解决方案1】:

    您需要确保您的源文件实际保存为 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

    【讨论】:

    • 是的,我确定文件是以 UTF-8 保存的。
    • 好吧,这没那么简单。我已经更新了回复 - 见上文。我希望这会有所帮助。
    猜你喜欢
    • 2012-09-13
    • 2015-06-26
    • 2013-01-20
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多