是否有任何解决方案可以将所有外国字符转换为A-z等价物?我在Google上进行了大量搜索,找不到解决方案,甚至找不到字符和等价物列表。原因是我想要显示仅A-z的URL,以及处理这些字符时的大量其他旅行。
答案 0 :(得分:24)
您可以使用iconv,它具有特殊的音译编码。
当字符串“// TRANSLIT”附加到tocode时,将激活音译。这意味着当一个字符无法在目标字符集中表示时,它可以通过一个或几个看起来与原始字符相似的字符来近似。
- http://www.gnu.org/software/libiconv/documentation/libiconv/iconv_open.3.html
See here获取与您的用例匹配的完整示例。
答案 1 :(得分:13)
如果您使用的是iconv,请确保在尝试音译之前正确设置了区域设置,否则某些字符将无法正确音译
setlocale(LC_CTYPE, 'en_US.UTF8');
答案 2 :(得分:6)
如果您遇到不支持PHP 5.4或更高版本的开发和发布环境,则应使用iconv或自定义音译库。
在iconv的情况下,我发现它非常无益,特别是在阿拉伯语或西里尔字母表上使用它。我会选择PHP 5.4内置Transliteration类或自定义Transliteration类。
其中一个解决方案提到custom library我没有测试过。
当我使用Drupal时,我喜欢他们的transliteration module,我最近移植它以使其在没有Drupal的情况下可用。
<?php
include "JTransliteration.php";
$mombojombotext = "誓曰:『時日害喪?予及女偕亡。』民欲與之偕亡,雖有";
$nonmombojombotex = JTransliteration::transliterate($mombojombotext);
echo $nonmombojombotex;
?>
答案 3 :(得分:6)
这将尽可能多地将外国字符(包括西里尔字母,中文,阿拉伯语等)转换为其A-z等价物:
$AzString = transliterator_transliterate('Any-Latin;Latin-ASCII;', $foreignString);
您可能首先需要install PHP Intl扩展名。
答案 4 :(得分:4)
注意:我将这个问题从另一个类似的问题转发,希望对其他人有帮助。
我最终在Django项目中编写了一个基于URLify.js的PHP库,因为我发现iconv()太不完整了。你可以在这里找到它:
https://github.com/jbroadway/urlify
处理拉丁字符以及希腊语,土耳其语,俄语,乌克兰语,捷克语,波兰语和拉脱维亚语。
答案 5 :(得分:1)
<?php
/**
* @author bulforce[]gmail.com # 2011
* Simple class to attempt transliteration of bulgarian lating text into bulgarian cyrilic text
*/
// Usage:
// $text = "yagoda i yundola";
// $tl = new Transliterate();
// echo $tl->lat_to_cyr($text); //ягода и юндола
class Transliterate {
private $cyr_identical = array("а", "б", "в", "в", "г", "д", "е", "ж", "з", "и", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ъ", "я");
private $lat_identical = array("a", "b", "v", "w", "g", "d", "e", "j", "z", "i", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "c", "y", "q");
private $cyr_fricative = array("ж", "ч", "ш", "щ", "ц", "я", "ю", "я", "ю");
private $lat_fricative = array("zh", "ch", "sh", "sht", "ts", "ia", "iu", "ya", "yu");
public function __construct() {
$this->identical_to_upper();
$this->fricative_to_variants();
}
public function lat_to_cyr($str) {
for ($i = 0; $i < count($this->cyr_fricative); $i++) {
$c_cyr = $this->cyr_fricative[$i];
$c_lat = $this->lat_fricative[$i];
$str = str_replace($c_lat, $c_cyr, $str);
}
for ($i = 0; $i < count($this->cyr_identical); $i++) {
$c_cyr = $this->cyr_identical[$i];
$c_lat = $this->lat_identical[$i];
$str = str_replace($c_lat, $c_cyr, $str);
}
return $str;
}
private function identical_to_upper() {
foreach ($this->cyr_identical as $k => $v) {
$this->cyr_identical[] = mb_strtoupper($v, 'UTF-8');
}
foreach ($this->lat_identical as $k => $v) {
$this->lat_identical[] = mb_strtoupper($v, 'UTF-8');
}
}
private function fricative_to_variants() {
foreach ($this->lat_fricative as $k => $v) {
// This handles all chars to Upper
$this->lat_fricative[] = mb_strtoupper($v, 'UTF-8');
$this->cyr_fricative[] = mb_strtoupper($this->cyr_fricative[$k], 'UTF-8');
// This handles variants
// TODO: fix the 3 leter sounds
for ($i = 0; $i <= count($v); $i++) {
$v[$i] = mb_strtoupper($v[$i], 'UTF-8');
$this->lat_fricative[] = $v;
if ($i == 0) {
$this->cyr_fricative[] = mb_strtoupper($this->cyr_fricative[$k], 'UTF-8');
} else {
$this->cyr_fricative[] = $this->cyr_fricative[$k];
}
$v[$i] = mb_strtolower($v[$i], 'UTF-8');
}
}
}
}
答案 6 :(得分:1)
对于作曲家来说,有slugify
https://github.com/cocur/slugify
use Cocur\Slugify\Slugify;
$slugify = new Slugify();
echo $slugify->slugify('Hello World!'); // hello-world
//You can also change the separator used by Slugify:
echo $slugify->slugify('Hello World!', '_'); // hello_world
//The library also contains Cocur\Slugify\SlugifyInterface. Use this interface whenever you need to type hint an instance of Slugify.
//To add additional transliteration rules you can use the addRule() method.
$slugify->addRule('i', 'ey');
echo $slugify->slugify('Hi'); // hey
答案 7 :(得分:1)
尝试这个
function Unaccent( $string ) {
$transliterator = Transliterator::createFromRules(':: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);
$normalized = $transliterator->transliterate($string);
return $normalized;
}
答案 8 :(得分:0)
您的查询存在的问题是,这是一件非常困难的事情。并非所有语言中的所有字形都具有az等价物,所有字形都具有语音等价物(但这些字不是字母),如果您只是处理基于拉丁语的语言,那么事情会变得容易些但是您仍然遇到像I-mutation这样的问题
你最好的解决方案是提出一个粗略的语音清单 - &gt; a-z等价物,它不会是完美的,但如果没有任何关于你的确切要求的信息,很难找到解决方案。
答案 9 :(得分:0)
尼斯图书馆发现于:
1)https://github.com/ashtokalo/php-translit(许多语言,但缺少某些语言)
2)https://github.com/fre5h/transliteration(仅限俄罗斯和乌克兰语)