19

是否有任何解决方案可以将所有外来字符转换为 Az 等价物?我在 Google 上进行了广泛搜索,但找不到解决方案,甚至找不到字符和等价物列表。原因是我想只显示 Az 的 URL,以及处理这些字符时的许多其他错误。

4

10 回答 10

24

您可以使用iconv,它具有特殊的音译编码。

当字符串“//TRANSLIT”附加到tocode时,音译被激活。这意味着当一个字符不能在目标字符集中表示时,可以通过一个或几个看起来与原始字符相似的字符来近似。

-- http://www.gnu.org/software/libiconv/documentation/libiconv/iconv_open.3.html

有关与您的用例匹配的完整示例,请参见此处。

于 2009-08-16T16:05:50.403 回答
13

如果您使用的是 iconv,则在尝试音译之前确保您的语言环境设置正确,否则某些字符将无法正确音译

setlocale(LC_CTYPE, 'en_US.UTF8');
于 2009-08-17T10:27:37.217 回答
9

这会将尽可能多的外来字符(包括西里尔文、中文、阿拉伯文等)转换为对应的 Az:

$AzString = transliterator_transliterate('Any-Latin;Latin-ASCII;', $foreignString);

您可能需要先安装PHP Intl 扩展。

于 2015-05-30T19:34:11.083 回答
7

如果您遇到不支持 PHP 5.4 或更新版本的开发和发布环境,您应该使用iconv或自定义音译库。

在 iconv 的情况下,我发现它非常无用,尤其是在阿拉伯语或西里尔字母上使用它。我会选择 PHP 5.4 内置 Transliteration 类或自定义 Transliteration 类。

发布的解决方案之一提到了一个我没有测试的自定义库。

当我使用 Drupal 时,我喜欢他们的音译模块,我最近移植了它,使它可以在没有 Drupal 的情况下使用。


您可以在这里下载并使用如下:

<?php

include "JTransliteration.php";

$mombojombotext = "誓曰:『時日害喪?予及女偕亡。』民欲與之偕亡,雖有";
$nonmombojombotex = JTransliteration::transliterate($mombojombotext);

echo $nonmombojombotex;

?>
于 2012-11-13T14:17:56.850 回答
4

注意:我从另一个类似的问题重新发布此问题,希望对其他人有所帮助。

我最终基于 Django 项目中的 URLify.js 编写了一个 PHP 库,因为我发现 iconv() 太不完整了。你可以在这里找到它:

https://github.com/jbroadway/urlify

处理拉丁字符以及希腊语、土耳其语、俄语、乌克兰语、捷克语、波兰语和拉脱维亚语。

于 2012-05-01T22:43:00.210 回答
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');
            }
        }
    }

}
于 2014-09-01T14:51:09.523 回答
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
于 2016-04-10T08:55:48.597 回答
1

试试这个

function Unaccent( $string ) {

$transliterator = Transliterator::createFromRules(':: NFD; :: [:Nonspacing Mark:] Remove; :: NFC;', Transliterator::FORWARD);

$normalized = $transliterator->transliterate($string);

return $normalized;

}
于 2020-03-16T00:03:12.790 回答
0

您的查询的问题是这是一件非常困难的事情。并非大多数语言中的所有字形都有 az 等价物,所有字形都有语音等价物(但这些是单词而不是字母),如果您只是处理基于拉丁语的语言,那么事情会容易一些,但您仍然会遇到诸如 I-mutation 之类的问题.

您最好的解决方案是提出一个粗略的语音列表 - > az 等效项,它不会是完美的,但是如果没有任何关于您确切要求的更多信息,很难开发一个解决方案。

于 2009-08-16T15:34:53.880 回答
0

不错的图书馆位于:

1) https://github.com/ashtokalo/php-translit(很多语言,但是缺少一些语言)

2) https://github.com/fre5h/transliteration(仅适用于俄语和乌克兰语)

于 2016-12-02T18:06:25.753 回答