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

Transliterator::transliterate -- transliterator_transliterateTransliterar una cadena


Estilo orientado a objetos

public Transliterator::transliterate(string $subject, int $start = ?, int $end = ?): string

Estilo por procedimientos

    mixed $transliterator,
    string $subject,
    int $start = ?,
    int $end = ?

Translitera una cadena o parte de la misma utilizando el transliterador de ICU.



En la versión por procedimientos, un objeto de la clase Transliterator o un string desde el cual se puede construir un objeto de la clase Transliterator.


La cadena a transformar.


El índice de inicio (en unidades de código UTF-16) desde el cual se empezará a transformar la cadena, inclusive. La indexación comienza en 0. El texto anterior a este índice se dejará tal cual.


El índice final (en unidades de código UTF-16) hasta el cual será transformala la cadena, exclusive. La indexación comienza en 0. El texto posterior a este índice se dejará tal cual.

Valores devueltos

La cadena transformada en caso de éxito, o false en caso de error.


Ejemplo #1 Converting escaped UTF-16 code units

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

// ahora la operación inversa con un caráctar suplementario
$carácterSuplementario = html_entity_decode('&#x1D11E;');
mb_strlen($carácter_suplementario, "UTF-8"), "\n";
$carácterSuplementarioCodificado = transliterator_transliterate("Any-Hex/Java", $carácter_suplementario);
// imprime dos unidades de código UTF-16 codificadas
echo $carácterSuplementarioCodificado, "\n";
// y volver
echo transliterator_transliterate("Hex-Any/Java", $carácterSuplementario ), "\n";

El resultado del ejemplo sería algo similar a:


Ver también

add a note

User Contributed Notes 5 notes

simonsimcity at gmail dot com
11 years ago
I pretty much like the idea of hdogan, but there's at least one group of characters he's missing: ligature characters.
They're at least used in Norwegian and I read something about French, too ... Some are just used for styling (f.e. fi)

Here's an example that supports all characters (should at least, according to the documentation):
(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"

In this example any character will firstly be converted to a latin character. If that's finished, replace all latin characters by their ASCII replacement.
simonsimcity at gmail dot com
9 years ago
Sorry, for posting it again, but I found a bug in my code:

If you have a character, like the cyrillic ь (a soft-sign - no sound), the "Any-Latin" would translate it to a prime-character, and the "Latin-ASCII" doesn't touch prime-characters. Therefore I added an option to remove all characters, that are higher than \u0100.

Here's my new code, including an example:

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"

Another approach, I found quite helpful (if you by no way want to remove characters ...), try to use iconv() in addition. This surely will just return ASCII characters.


Also an example here:

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 years ago
You can create slugs easily with:

function slugify($string) {
$string = transliterator_transliterate("Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();", $string);
$string = preg_replace('/[-\s]+/', '-', $string);
trim($string, '-');

slugify("Я люблю PHP!");
7 years ago
There are some possibly undesirable conversions with ASCII//TRANSLIT//IGNORE or your users may require some custom stuff.

You might want to run a substitution up front for certain things, such as when you want 3 letter ISO codes to replace currency symbols. £ transliterates to "lb", for example, which is incorrect since it's a currency symbol, not a weight symbol (#).

ASCII//TRANSLIT//IGNORE does a great job within the realm of possibility :-)

When it doesn't do something you want it to, you can set up a CSV with one replacement per line and run a function like:

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;

or you can write some regexes. Transliterating using ASCII//TRANSLIT//IGNORE works so well that your map probably won't be very long...
jinmoku at hotmail dot com
13 years ago
OOP version :

= 'àáâãäçèéêëìíîïñòóôõöùúûüýÿ
$rule = 'NFD; [:Nonspacing Mark:] Remove; NFC';

$myTrans = Transliterator::create($rule);

To Top