- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
有没有好的解决方案可以很好地进行这种音译?
我试过使用 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 + $ + ? + @
使用 solution of this guy也无法正常工作:Regular ascii text + YYYYY + aous + eYYYeY + aoY + $ + � + @
即使使用 PECL intl Normalizer类(即使您的 PHP > 5.3.0,也并非总是可用,因为 PHP 可能无法使用 ICU 包国际使用,即在某些托管服务器上)产生错误的结果:
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()
并自己定义音译表?
//附录:我在 ZF wiki 上发现了 2008 年关于 proposal for Zend_Filter_Transliterate 的辩论但项目被放弃,因为在某些语言中无法转换(即中文),但对于任何基于拉丁语和西里尔语的语言 IMO 仍然应该存在此选项。
最佳答案
Patchwork\Utf8 的 toAscii() 函数正是这样做的,参见:
https://github.com/nicolas-grekas/Patchwork-UTF8/blob/master/src/Patchwork/Utf8.php
它利用 iconv 和 intl 的 Normalizer 来删除重音、拆分连字和执行许多其他通用音译。
关于php - 将任何可转换的 utf8 char 音译成 ascii 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13614622/
有没有办法让音译在 Emacs 中工作,就像现在在 Gmail 中一样?我特别有兴趣让它在西里尔文中工作。 作为引用,Gmail 执行以下操作:我可以输入svoboda,它会输出свобода。这允许
ruby中非英文字符的音译最简单的方法是什么。即转换如: 翻译“Gévry” #=> "Gevry" 最佳答案 Ruby 有一个 Iconv其 stdlib 中的库以与通常的 iconv 命令非常相似
ruby 1.9.3 警告 iconv 弃用,但我使用 iconv 删除变音符号以从 Iconv.iconv('asccii//translit', 'utf-8', 'Těžiště') 返回 Te
在 Ruby on Rails 中,您可以轻松地将“任何”文本转换为适用于子域/路径名的格式。 1) "I am nobody." -> "i-am-nobody" 2) "Grünkohl is a
我想将西里尔文字符串音译成最接近的拉丁文等价物。例如。 “матрешка”=> “matreshka”,“водка”=> “伏特加”。所以理想情况下,我希望在 NSString 或其他已经了解字母
以下是将 Google Transliteration 代码集成到 ASP.Net Pages 中的示例代码(随处可用)。 但我的问题是,如何在将在运行时生成的文本框中启用音译?此脚本需要文本框的 I
我正在使用 Java Swing 开发一个音译项目。它可以访问互联网,但我无法设置它。我们该怎么做?我们需要下载 Google API 库还是只需要一个函数调用就可以了? 这里有一些有用的音译链接:
在我们的 RoR 项目中,我们使用 postgres unaccent 函数来检索我们模型名称属性之一的非重音版本。 name 属性可以包含来自各种语言的任何重音字符。然后我们将其保存为 unacce
如何在我的 Java 应用程序中使用 Google Transliteration API。 如果我给一个String(英语或阿拉伯语)作为输入,Google Transliterator API 应
我正在做一个基于泰米尔语的 Web 应用程序。在我的应用程序中,我使用动态字段来添加用户详细信息。那么,动态字段有多个 ID 如何做到这一点或如何使用基于类的 Google 音译? // Lo
我有一个字符串对象 “有多个字符甚至特殊字符” 我正在尝试使用 UTF8Encoding utf8 = new UTF8Encoding(); ASCIIEncoding ascii = new AS
我使用过“Google AJAX Transliteration API”,它对我来说很顺利。 http://code.google.com/apis/ajaxlanguage/documentati
我是一名优秀的程序员,十分优秀!