"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > PHP: indo para multibytes

PHP: indo para multibytes

Publicado em 2024-08-18
Navegar:748

PHP: Going multibytes

Caracteres multibyte podem ser complicados na programação.

Aviso

mbstring não está habilitado por padrão. Certifique-se de ler essa parte antes.

Por que se preocupar com strings multibyte?

Um documento pode conter strings multibyte. Embora o PHP tenha muitos auxiliares úteis para strings, esses auxiliares simplesmente não se destinam a strings multibyte.

Provavelmente causará bugs desagradáveis ​​e outros erros inesperados, especialmente quando você contar caracteres.

É por isso que você prefere usar funções de string multibyte em PHP.

Além disso, novas funções de string multibyte, como mb_trim, mb_ltrim e mb_rtrim estarão disponíveis na versão 8.4 (a próxima versão do PHP no momento em que este artigo foi escrito).

Por que alguns caracteres requerem vários bytes?

O inglês usa o conjunto de caracteres ASCII, portanto letras como r ou s requerem apenas um byte.

Em contraste, alguns idiomas usam caracteres que precisam de mais de um byte, por exemplo, caracteres Han (podem ter até 6 bytes!).

Alguns exemplos

Contar caracteres

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

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

Encontrar posição

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

Cortar barbante

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

Impacto no desempenho

Você pode ler que as funções mbstring podem ter um impacto significativo.

Você pode até reproduzi-lo com o seguinte 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 



Fonte: bugs do PHP

As funções

mb_* são mais lentas, mas é sempre uma compensação, e somente o contexto deve determinar se você deve usar esses auxiliares ou criar os seus próprios.

Por exemplo, se você substituir $cnt = 100000; por $cnt = 100; no script acima, os auxiliares mb_* ainda são significativamente mais lentos, mas o impacto final pode ser bom no seu caso (por exemplo, 0,008 ms vs. 0,004 ms).

Concluir

Você deve levar em conta os multibytes, especialmente em um contexto multilíngue, e o PHP possui ajudantes integrados para isso.

Declaração de lançamento Este artigo está reproduzido em: https://dev.to/spo0q/php-going-multibytes-3b3b?1 Se houver alguma infração, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3