2024 年 PHP 日本大会

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
function 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 可能存在一些不良转换,或者您的用户可能需要一些自定义内容。

你可能想预先进行一些替换操作,例如,当你想用三个字母的 ISO 代码替换货币符号时。例如,£ 转写为 "lb",这是不正确的,因为它是一个货币符号,而不是重量符号(#)。

ASCII//TRANSLIT//IGNORE 在其能力范围内做得很好 :-)

如果它没有做你想让它做的事情,你可以创建一个 CSV 文件,每行一个替换项,并运行如下函数:

function 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