iconv utf-8到mod_php / apache2中的ascii音译

时间:2010-08-24 17:02:41

标签: php apache2 iconv transliteration mod-php

我需要比较字符串和匹配名称,即使它们没有拼写相同的方式。 例如,DÉSIRÉ-Smith应与Desireesmith以及Desiree或Desi'ree Smith

匹配

所以我使用PHP-CLI在命令行中完成了以下approch:

    <?
    class Alike {
      static function convertAlike($string) {
        // in case the first and last name or two first names are mixed up
        $parts = preg_split('/[\s\-\.\_]/', $string, -1, PREG_SPLIT_NO_EMPTY);
        sort($parts);
        $string = implode($parts);

        $string = iconv('UTF-8', 'ASCII//TRANSLIT', $string); // transliterate
        $string = strtolower($string); // lowercase
        $string = preg_replace('/[^a-z]/','',$string); // remove everything but a-z
        $string = preg_replace('{(.)\1+}','$1',$string); // remove duplicate chars
        return $string;
      }
      static function compareAlike($string1,$string2) {
        return (strcmp(Alike::convertAlike($string1),Alike::convertAlike($string2)) === 0) ? true : false;
      }
    }
    echo Alike::convertAlike("DÉSIRÉ-Smith").PHP_EOL; // desiresmith
    echo Alike::convertAlike("Desireesmith").PHP_EOL; // desiresmith
    echo Alike::convertAlike("Desi'ree Smith").PHP_EOL; // desiresmith
    echo Alike::convertAlike("René Röyßeå likes special characters ½ € in ©").PHP_EOL; // reneroysealikespecialcharacterseurinc

    var_dump(Alike::compareAlike("DÉSIRÉ-Smith","Desireesmith")); // true
    var_dump(Alike::compareAlike("Desireesmith","Desi'ree Smith")); // true
    var_dump(Alike::compareAlike("summer","winter")); // false
    ?>

然而,在我的网站上运行Server version: Apache/2.2.14 (Ubuntu)运行PHP Version 5.3.2-1ubuntu4.2作为模块,我总是得到问号。 有趣的是,错误必须在此行中出现

$string = iconv('UTF-8', 'ASCII//TRANSLIT', $string); // transliterate

因为之后我可以看到每个未被音译过的角色,但那些应该被ascii字符取代的角色会成为问号。

我尝试了输入/输出字符串编码和iconv内部,输入和输出编码设置以及区域设置的所有可能组合。我甚至做了chmod -R 777 / usr / lib / gconv并转移到了我的工作目录。

但是我在邮件列表上看到了这个错误: http://bugs.php.net/bug.php?id=44096

[2010-06-07 21:22 UTC] icovt at yahoo dot com
mod_php iconv() is not working properly if your apache is chrooted and you do not 
have the content of /usr/lib/gconv/ folder into your relative chroot path (i.e. 
/your/chroot/path/usr/lib/gconv/). 
You can simply do: 
cp /usr/lib/gconv/* /your/chroot/path/usr/lib/gconv/
... and re-try.

This was a fix for me, hope this could save time for somebody else.

P.S. Btw, initially iconv() called from command line (using php cli) was OK.

我试过我的www-data用户在/ var / www /的家里,我最后得到了文件夹/ var / www / usr / lib / gconv /以及/ var / www / myproject / usr / LIB / gconv /

仅供参考:我有编码检测和转码功能,以确保传递正确的编码,但为了清晰起见删除了它们,因为如果输入utf8字符串,一切都应该没问题,不需要它们。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

发现区域设置没有正确设置,我设置它的尝试失败,因为它们在系统上可用的区域设置实际上被命名为不同于手册页示例(根据它们的编码!) 一个简单的locale -a揭示了; O)

setlocale(LC_ALL, "en_US.utf8");

这实际上完成了这项工作!

现在这个功能完美无缺。

现在很清楚为什么它也可以从控制台运行,因为语言环境是从当前用户shell设置导入的;) 它实际上只需要设置任何语言环境。当我们转换为每个人都相等的ascii时,哪一个真正重要,只有一些比其他人更平等:)

小心设置系统中实际安装的区域设置并检查setlocale的结果,因为如果未安装区域设置或名称拼写错误,您将不会更改任何内容。