"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > PHP: pasando a multibytes

PHP: pasando a multibytes

Publicado el 2024-08-18
Navegar:703

PHP: Going multibytes

Los caracteres multibyte pueden ser complicados en la programación.

Advertencia

mbstring no está habilitado de forma predeterminada. Asegúrate de leer esa parte antes.

¿Por qué molestarse con cadenas multibyte?

Un documento puede contener cadenas multibyte. Si bien PHP tiene muchos asistentes útiles para cadenas, estos asistentes simplemente no están destinados a cadenas multibyte.

Es probable que cause errores desagradables y otros errores inesperados, especialmente cuando cuentas caracteres.

Es por eso que prefieres usar funciones de cadena multibyte en PHP.

Además, nuevas funciones de cadenas multibyte, como mb_trim, mb_ltrim y mb_rtrim estarán disponibles en 8.4 (la próxima versión de PHP en el momento de escribir este artículo).

¿Por qué algunos caracteres requieren varios bytes?

El inglés utiliza el juego de caracteres ASCII, por lo que letras como r o s solo requieren un byte.

Por el contrario, algunos idiomas utilizan caracteres que necesitan más de un byte, por ejemplo, los caracteres Han (¡pueden tener hasta 6 bytes!).

Algunos ejemplos

contar caracteres

$strings = [
    "?????",
    "チャーミング",
    "González",
];

foreach ($strings as $string) {
    echo 'strlen:' . strlen($string) . ' vs. mb_strlen:' . mb_strlen($string) . PHP_EOL;
}

encontrar posición

echo strpos("チャーミング", "ャ"); // gives 3
echo mb_strpos("チャーミング", "ャ"); // gives 1 because 1st position is 0

Cortar hilo

echo substr("チャーミング", 3) . PHP_EOL;// ャーミング
echo mb_substr("チャーミング", 3);// ミング

Impacto en el rendimiento

Puede que leas que las funciones mbstring pueden tener un impacto significativo.

Incluso puedes reproducirlo con el siguiente script:

$cnt = 100000;

$strs = [
    'empty' => '',
    'short' => 'zluty kun',
    'short_with_uc' => 'zluty Kun',
    'long' => str_repeat('this is about 10000 chars long string', 270),
    'long_with_uc' => str_repeat('this is about 10000 chars long String', 270),
    'short_utf8' => 'žlutý kůň',
    'short_utf8_with_uc' => 'Žlutý kŮň',
];

foreach ($strs as $k => $str) {
    $a1 = microtime(true);
    for($i=0; $i 



Fuente: errores de PHP

Las funciones mb_* son más lentas, pero siempre es una compensación, y solo el contexto debería determinar si debes usar estos asistentes o crear los tuyos propios.

Por ejemplo, si reemplaza $cnt = 100000; por $cnt = 100; en el script anterior, los asistentes mb_* siguen siendo significativamente más lentos, pero el impacto final podría estar bien en su caso (p. ej., 0,008 ms frente a 0,004 ms).

Envolver

Debes tener en cuenta los multibytes, especialmente en un contexto multilingüe, y PHP tiene ayudas integradas para eso.

Declaración de liberación Este artículo se reproduce en: https://dev.to/spo0q/php-going-multibytes-3b3b?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3