この音訳を適切に行うための良い解決策はありますか?
を使ってみましiconv()
たが、とても煩わしく、思ったように動作しません。
- を使用
//TRANSLIT
すると、可能なものを置き換えようとし、すべてを「?」として変換できなくなります。 - 使用
//IGNORE
すると「?」が残りません テキストではありますが、音訳せず、変換不可能E_NOTICE
な文字が見つかった場合にも発生するため、@エラーサプレッサーでiconvを使用する必要があります //IGNORE//TRANSLIT
(PHPフォーラムで提案されているように)使用することは、実際には//IGNORE
(phpバージョン5.3.2および5.3.13で自分で試した)と同じです。- 使用
//TRANSLIT//IGNORE
も同じです//TRANSLIT
また、現在のロケール設定を使用して音訳します。
警告-多くのテキストとコードが続いています!
ここではいくつかの例を示します。
$text = 'Regular ascii text + čćžšđ + äöüß + éĕěėëȩ + æø€ + $ + ¶ + @';
echo '<br />original: ' . $text;
echo '<br />regular: ' . iconv("UTF-8", "ASCII//TRANSLIT", $text);
//> regular: Regular ascii text + ????? + ???ss + ?????? + ae?EUR + $ + ? + @
setlocale(LC_ALL, 'en_GB');
echo '<br />en_GB: ' . iconv("UTF-8", "ASCII//TRANSLIT", $text);
//> en_GB: Regular ascii text + cczs? + aouss + eeeeee + ae?EUR + $ + ? + @
setlocale(LC_ALL, 'en_GB.UTF8'); // will this work?
echo '<br />en_GB.UTF8: ' . iconv("UTF-8", "ASCII//TRANSLIT", $text);
//> en_GB.UTF8: Regular ascii text + cczs? + aouss + eeeeee + ae?EUR + $ + ? + @
わかりました、それはčćšäöüßéĕěėëȩとæを変換しましたが、なぜđとøではないのですか?
// now specific locales
setlocale(LC_ALL, 'hr_Hr'); // this should fix croatian đ, right?
echo '<br />hr_Hr: ' . iconv("UTF-8", "ASCII//TRANSLIT", $text);
// wrong > hr_Hr: Regular ascii text + cczs? + aouss + eeeeee + ae?EUR + $ + ? + @
setlocale(LC_ALL, 'sv_SE'); // so this will fix swedish ø?
echo '<br />sv_SE: ' . iconv("UTF-8", "ASCII//TRANSLIT", $text);
// will not > sv_SE: Regular ascii text + cczs? + aouss + eeeeee + ae?EUR + $ + ? + @
//this is interesting
setlocale(LC_ALL, 'de_DE');
echo '<br />de_DE: ' . iconv("UTF-8", "ASCII//TRANSLIT", $text);
//> de_DE: Regular ascii text + cczs? + aeoeuess + eeeeee + ae?EUR + $ + ? + @
// actually this is what any german would expect since ä ö ü really is same as ae oe ue
試してみましょう//IGNORE
:
echo '<br />ignore: ' . iconv("UTF-8", "ASCII//IGNORE", $text);
//> ignore: Regular ascii text + + + + + $ + + @
//+ E_NOTICE: "Notice: iconv(): Detected an illegal character in input string in /var/www/test.server.web/index.php on line 49"
// with translit?
echo '<br />ignore/translit: ' . iconv("UTF-8", "ASCII//IGNORE//TRANSLIT", $text);
//same as ignore only> ignore/translit: Regular ascii text + + + + + $ + + @
//+ E_NOTICE: "Notice: iconv(): Detected an illegal character in input string in /var/www/test.server.web/index.php on line 54"
// translit/ignore?
echo '<br />translit/ignore: ' . iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", $text);
//same as translit only> translit/ignore: Regular ascii text + cczs? + aouss + eeeeee + ae?EUR + $ + ? + @
この男のソリューションを使用しても、期待どおりに機能しません:Regular ascii text + YYYYY + aous + eYYYeY + aoY + $ + � + @
PECL intl Normalizerクラスを使用しても(PHP> 5.3.0を使用している場合でも、常に使用できるとは限りません。ICUパッケージintlが使用するPHPは、特定のホスティングサーバーでは使用できない場合があるため)、間違った結果が生成されます。
echo '<br />normalize: ' .preg_replace('/\p{Mn}/u', '', Normalizer::normalize($text, Normalizer::FORM_KD));
//>normalize: Regular ascii text + cczsđ + aouß + eeeeee + æø€ + $ + ¶ + @
それで、これを正しく行う他の方法はありますか、または行うべき唯一の適切なことは、音訳テーブルを自分で行うpreg_replace()
か、定義することですか?str_replace()
//付録:2008年のZF wikiの討論で、Zend_Filter_Transliterateの提案について見つけましたが、一部の言語(つまり中国語)では変換できないため、プロジェクトは中止されましたが、ラテン語およびシリルベースの言語IMOではこのオプションが使用されます存在する必要があります。