PHP的Charset问题

时间:2011-04-22 17:39:03

标签: php utf-8 character-encoding

我的PHP代码存在问题,它会转换非重音字符中的重音字符。我有一年前使用此代码,但我试图让它工作但没有成功。翻译没有正确完成。

以下是代码:

<?php

echo accentdestroyer('azeméis');

    /**
     * 
     * This function transform accent characters to non accent characters
     * @param text $string
     */
    function accentdestroyer($string) {
        $string=strtr($string,
        "()!$?: ,&+-/.ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ"
        ,
        "-------------SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy");

        return $string;
    }

?>

我已经测试过将文档保存为UTF-8但是给我这样的东西:“azemy is”

我可以采取哪些线索来使其正常工作?

最诚挚的问候,

1 个答案:

答案 0 :(得分:2)

更好的解决方案可能是使用transliterate自动iconv()这些字符。

至于你的功能不起作用的原因,它可能与echo strlen('Š');输出2的事实有关。documentation显式引用单字节字符

此外,

$a = 'Š';

var_dump(strtr('Š', 'Š', '!')); // string(2) "!�"

所以第一个字节已匹配,但第二个字节(剩余)不是指向有效Unicode字符的字节。

更新

以下是使用iconv()的工作示例。

$str = 'ŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚ';

$str = iconv("utf-8", "us-ascii//TRANSLIT", $str); 

var_dump($str); // string(37) "OEZsoezY?uAAAAAAAECEEEEIIII?NOOOOO?UU"

有些字符没有完全翻译,例如¥Ø,但大多数人都这样做了。您可以将//IGNORE附加到输出字符集,以静默方式丢弃那些不会音译的字符集。

您也可以使用\pL {{1}}删除所有非字字符。