2024 PHP Conference Japan

Transliterator::transliterate

transliterator_transliterate

(PHP 5 >= 5.4.0,PHP 7,PHP 8,PECL intl >= 2.0.0)

Transliterator::transliterate -- transliterator_transliterate音譯字串

說明

物件導向風格

public Transliterator::transliterate(字串 $string, 整數 $start = 0, 整數 $end = -1): 字串|false

程序式風格

transliterator_transliterate(
    Transliterator|字串 $transliterator,
    字串 $string,
    整數 $start = 0,
    整數 $end = -1
): 字串|false

使用 ICU 轉寫器轉換字串或其一部分。

參數

transliterator

在程序版本中,可以是 Transliterator 或可以構建 Transliterator字串

string

要轉換的字串。

start

字串開始轉換的起始索引(以 UTF-16 字碼單位計),包含在內。索引從 0 開始。之前的文字將保持不變。

end

字串轉換的結束索引(以 UTF-16 字碼單位計),不包含在內。索引從 0 開始。之後的文字將保持不變。

返回值

成功時返回轉換後的字串,失敗時返回 false

範例

範例 #1 轉換跳脫的 UTF-16 字碼單位

<?php
$s
= "\u304A\u65E9\u3046\u3054\u3056\u3044\u307E\u3059";
echo
transliterator_transliterate("Hex-Any/Java", $s), "\n";

//現在使用增補字元進行反向操作
$supplChar = html_entity_decode('&#x1D11E;');
echo
mb_strlen($supplChar, "UTF-8"), "\n";
$encSupplChar = transliterator_transliterate("Any-Hex/Java", $supplChar);
//輸出兩個編碼的 UTF-16 字碼單位
echo $encSupplChar, "\n";
//然後返回
echo transliterator_transliterate("Hex-Any/Java", $encSupplChar), "\n";
?>

以上範例將輸出類似以下的內容

お早うございます
1
\uD834\uDD1E
𝄞

另請參閱

新增註記

使用者貢獻的註記 5 則註記

simonsimcity at gmail dot com
11 年前
我很喜歡 hdogan 的想法,但他至少遺漏了一組字元:連字字元。
它們至少在挪威語中使用,我也讀到過一些關於法語的資料…有些只是用於樣式設計(例如 fi)

以下是一個支援所有字元(至少根據文件應該支援)的範例
<?php
var_dump
(transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', "A æ Übérmensch på høyeste nivå! И я люблю PHP! fi"));
// string(41) "a ae ubermensch pa hoyeste niva! i a lublu php! fi"
?>

在此範例中,任何字元都將首先轉換為拉丁字元。完成後,將所有拉丁字元替換為其 ASCII 對應字元。
simonsimcity at gmail dot com
10 年前
抱歉再次發布,但我發現我的程式碼中有一個錯誤

如果您有一個字元,例如西里爾字母 ь(一個軟音符號 - 無聲),則「Any-Latin」會將其翻譯成一個質數字元,「Latin-ASCII」不會觸及質數字元。因此,我新增了一個選項來移除所有高於 \u0100 的字元。

這是我的新程式碼,包括一個範例

var_dump(transliterator_transliterate('Any-Latin; Latin-ASCII; [\u0100-\u7fff] remove',
"A æ Übérmensch på høyeste nivå! И я люблю PHP! есть. fi"));
// string(50) "A ae Ubermensch pa hoyeste niva! I a lublu PHP! est. fi"

我發現另一個很有幫助的方法(如果您無論如何都不想移除字元…),請嘗試額外使用 iconv()。這肯定只會返回 ASCII 字元。

請參閱:http://stackoverflow.com/a/3542748/517914

這裡也有一個範例

var_dump(iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", transliterator_transliterate('Any-Latin; Latin-ASCII',
"A æ Übérmensch på høyeste nivå! И я люблю PHP! есть. fi"));
// string(50) "A ae Ubermensch pa hoyeste niva! I a lublu PHP! est'. fi"
hdogan at gmail dot com
12 年前
您可以使用以下方法輕鬆建立 slug

<?php
函式 slugify($string) {
$string = transliterator_transliterate("Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();", $string);
$string = preg_replace('/[-\s]+/', '-', $string);
return
trim($string, '-');
}

echo
slugify("Я люблю PHP!");
?>
匿名
8 年前
使用 ASCII//TRANSLIT//IGNORE 可能會產生一些非預期的轉換,或者您的使用者可能需要一些客製化的處理。

您可能需要預先執行一些替換,例如,當您希望使用 3 個字母的 ISO 代碼來替換貨幣符號時。 例如,£ 會被轉換為 "lb",這是不正確的,因為它是一個貨幣符號,而不是重量符號 (#)。

ASCII//TRANSLIT//IGNORE 在其能力範圍內做得很好 :-)

如果它沒有執行您想要的操作,您可以設定一個 CSV 檔案,每行一個替換項目,然後執行如下函式:

函式 stripByMap($inputString, $mapFile)
{
$csv = file($mapFile);
foreach($csv as $line)
{
$arrLine = explode(',', trim($line));
$inputString = str_replace($arrLine[0],$arrLine[1],$inputString);
}
return $inputString;
}

或者您可以編寫一些正規表達式。 使用 ASCII//TRANSLIT//IGNORE 進行轉換的效果非常好,所以您的對應表可能不會很長...
jinmoku at hotmail dot com
13 年前
物件導向版本

<?php
$str
= 'àáâãäçèéêëìíîïñòóôõöùúûüýÿ
ÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ'
;
$rule = 'NFD; [:Nonspacing Mark:] Remove; NFC';

$myTrans = Transliterator::create($rule);
echo
$myTrans->transliterate($str);

//aaaaaceeeeiiiinooooouuuuyy
//AAAAACEEEEIIIINOOOOOUUUUY
?>
To Top