Verdadero PHP

Acerca de   |   ES   |   EN

007b Mas Strings: Unicode

Desde la creación de computadoras, ha habido una necesidad de tener un manera de codificar texto de tal manera que los humanos pudieran leerlo. Uno de los primeros estándares se llama ASCII. Fue limitado en el número de caracteres que podía codificar. De tal manera en que las computadoras proliferaron por el mundo, hubo una necesidad de incluir más idiomas y caracteres. En los 1980, un grupo llamado el Consorcio Unicode (una organización sin ánimo de lucro) fue establecido. Ellos formaron un estándar llamado Unicode cuyo propósito era de incluir la codificación de todo idioma moderna y actualmente usado en el mundo. El estándar incluye millones de caracteres e incluye no tan solo lenguas vivas pero también muchos alfabetos y silabarios históricos.

Uno de los aspectos definitorios de la codificación ASCII es que cada carácter es representado por un byte (u ocho bits) de memoria. Para poder cubrir la cantidad grande de caracteres, se utiliza más de un byte. Por lo tanto, en PHP, muchas funciones relacionadas con Unicode tienen el prefijo "mb" lo cual representa "multibyte".

Existen más que un estándar de codificación Unicode: UTF-8, UTF-16, and UTF-32 son entre los más comunes, pero sucede de que hay más codificaciones que solo ASCII y Unicode. PHP soporta muchas codificaciones. Por ahora, nos enfocamos en Unicode.

Sintaxis de escape de puntos de códigos de Unicode

Es posible sacar a caracteres Unicode utilizando un escape de puntos de códigos de Unicode en forma hexadecimal.

<?php
echo "\u{aa}"; // "ª"
echo "\u{000aa}"; // "ª" (igual como la línea anterior porque los cero de prefijo son opcional)
echo "\u{9999}"; // "香"


Lo siguiente son varios funciones multibyte comunes para dar idea de como funcionan.
No es una lista completa.

mb_ord() y mb_chr()

La función mb_ord() obtiene el punto de código de Unicode de un carácter. La función mb_chr() obtiene un carácter dado el punto de código. Es importante no usar codificaciones de ASCII con estas funciones porque no darán los valores correctos. Igual de importante es de no usar caracteres Unicode con las funciones de strings regulares por la misma razón. Esto se aplica a todas las funciones de multibyte.

<?php
// ascii: "teoría del lenguaje";
// unicode: "语言处理";

echo ord("l"); // 108
echo mb_ord("l"); // 108
echo ord("语"); // 232
echo mb_ord("语"); // 35821
echo mb_ord("语", "UTF-16"); // 59567

echo chr(108); // "l"
echo mb_chr(108); // "l"
echo chr(232); // �
echo mb_chr(35821); // "语"

// No lo esperas? Recuerda que la entrada arriba es UTF-8, y
// tratamos de poner eso en un punto de código de UTF-16
echo mb_chr(59567, "UTF-16"); // �

mb_substr()

La función mb_substr() obtiene parte de un string.

<?php
// mb_substr(string, inicio, llargura, codificación);
// ascii: "teoría del lenguaje";
// unicode: "语言处理";

echo substr("teoría del lenguaje", 2, 1); // "o"
echo mb_substr("teoría del lenguaje", 2, 1); // "o"

echo substr("语言处理", 2, 1); // �
echo mb_substr("语言处理", 2, 1); // "处"

mb_str_split()

La función mb_str_split() obtiene una matriz de caracteres dado un string.

<?php
// mb_str_split(string, largura_de_cada_elemento = 1, codificación);
// ascii: "teoría del lenguaje"
// unicode: "语言处理"

print_r(str_split("teoría del lenguaje"));
print_r(mb_str_split("teoría del lenguaje"));
/* Los dos producen el mismo resultado:
Array
(
    [0] => t
    [1] => e
    [2] => o
    [3] => r
    [4] => �
    [5] => �
    [6] => a
    [7] =>  
    [8] => d
    [9] => e
    [10] => l
    [11] =>  
    [12] => l
    [13] => e
    [14] => n
    [15] => g
    [16] => u
    [17] => a
    [18] => j
    [19] => e
)
*/

print_r(str_split("语言处理"));
/*
Array
(
    [0] => �
    [1] => �
    [2] => �
    [3] => �
    [4] => �
    [5] => �
    [6] => �
    [7] => �
    [8] => �
    [9] => �
    [10] => �
    [11] => �
)
*/
print_r(mb_str_split("语言处理"));
/*
Array
(
    [0] => 语
    [1] => 言
    [2] => 处
    [3] => 理
)
*/

mb_strlen()

La función mb_strlen() regrese una cuenta del número de caracteres en un string.

<?php
// mb_strlen(string, codificación);
// ascii: "teoría del lenguaje"
// unicode: "语言处理"

echo strlen("teoría del lenguaje"); // 15
echo mb_strlen("teoría del lenguaje"); // 15

echo strlen("语言处理"); // 12
echo mb_strlen("语言处理"); // 4

mb_strpos()

La función mb_strpos() obtiene la posición de un string (basado en cero) dentro de un string.

<?php
// mb_strpos(pajar, aguja, offset, codificación);
// ascii: "teoría del lenguaje"
// unicode: "语言处理"
echo strpos("teoría del lenguaje", "gua"); // 15
echo mb_strpos("teoría del lenguaje", "gua"); // 15

echo strpos("语言处理", "处"); // 6
echo mb_strpos("语言处理", "处"); // 2


Recursos


Retos

Emoji diversión

Encuentra una lista en línea de los puntos de código por emoji. Luego trata de sacar unos emojis usando el sintaxis de escape de puntos de códigos de Unicode.

Explorando la funciones mb_*

Visita la lista de las funciones de strings multibyte de PHP. Elija por los menos tres que no están es esta página y trátalos.

Hacer tu propia función

Hacer tu propia función que acepta a un string UTF-8 como entrada y regresa la misma palabra por con las mayúsculas invertidas.