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 $string, int $start = 0, int $end = -1): string|false

过程化风格

transliterator_transliterate(
    Transliterator|string $transliterator,
    string $string,
    int $start = 0,
    int $end = -1
): string|false

使用 ICU 转换器转换字符串或其部分。

参数

transliterator

在过程化版本中,可以是 Transliterator 或可以构建 Transliteratorstring

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 notes

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
11 年前
你可以轻松地创建 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!");
?>
匿名
7 年前
使用 ASCII//TRANSLIT//IGNORE 可能会导致一些不希望的转换,或者你的用户可能需要一些自定义内容。

你可能想要提前运行一个替换操作来处理某些内容,例如当你想要用 3 个字母的 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