Strings multibyte: o que são e por que você precisa da extensão mbstring do PHP

Strings multibyte são textos que possuem alguns caracteres que demandam mais de um byte para serem representados. Há um post aqui no blog onde nós falamos sobre Charsets e Encodings: Como strings funcionam. Agora nós vamos entender como lidar com strings multibyte em PHP usando a extensão mbstring.

Operações em strings

Quando trabalhamos com textos, é bastante comum precisarmos realizar algumas operações. Transformar todas as letras em maiúsculas ou minúsculas, por exemplo, é uma operação corriqueira. Até operações mais simples como contar o número de caracteres podem nos trazer algumas dores de cabeça se estivermos trabalhando com strings multibyte.

Um exemplo bastante simples:

<?php

echo strlen('Olá'); // Exibe 4
echo strtoupper('olá'); // Exibe "OLá"

Strings multibyte

Como foi exposto logo na introdução do post, uma string multibyte é um texto que possui caracteres que demandam mais de um byte para serem representados. Caracteres com acento são um ótimo exemplo desse cenário. É necessário mais de um byte para representá-los, já que em um único byte nós conseguimos representar apenas 256 caracteres, que são, não coincidentemente, os caracteres da tabela ASCII.

As funções padrão de strings do PHP lidam assumindo que cada caractere da string possui um byte, por isso a contagem de caracteres é inválida com strlen e por isso que funções como strtoupper ou strtolower não conseguem modificar os caracteres acentuados.

Extensão mbstring

Como nós cotidianamente trabalhamos com strings que contenham caracteres fora da tabela ASCII, obviamente o PHP não nos deixaria desamparados nessa situação. Para realizar operações em strings multibyte nós podemos usar a extensão mbstring. Nós já falamos sobre extensões PHP aqui no blog, então vou partir do princípio que você já possui familiaridade com o assunto.

A extensão mbstring nos fornece diversas funções que possibilitam a manipulação de strings multibyte, indo de operações simples como contar o número de caracteres de uma string até operações mais complexas como converter o encoding de uma string.

A maioria das funções "padrão" de strings do PHP possui uma contraparte na mbstring, sendo apenas prefixada com mb_. O exemplo de código anteriormente exposto que nos gerava o resultado inesperado poderia ser escrito da seguinte forma:

<?php

echo mb_strlen('Olá'); // Exibe 3
echo mb_strtoupper('olá'); // Exibe "OLÁ"

Além disso, se eu possuo uma string que está no encoding ISO-8859-1 ou WINDOWS-1252, eu posso converter facilmente para UTF-8 com o seguinte código:


echo mb_convert_encoding('string em ISO-8859-1', 'UTF-8', 'ISO-8859-1');

utf8_encode e utf8_decode

Quem me acompanha já sabe que as funções utf8_encode e utf8_decode serão marcadas como obsoletas no PHP 8.2. Quem ainda não sabia disso pode conferir o vídeo a seguir:

Novidades do PHP 8.2: Descontinuação de utf8_encode e utf8_decode | Dias de Dev

Como foi explicado no vídeo, essas funções serão descontinuadas já que são confusas e o uso de mbstring é uma opção válida para chegar ao mesmo resultado. A seguir você pode conferir como seria realizada a conversão das strings sem as famosas funções de utf8_:

<?php

// Equivalente a utf8_encode('string em ISO-8859-1');
echo mb_convert_encoding('string em ISO-8859-1', 'UTF-8', 'ISO-8859-1');

// Equivalente a utf8_decode('string em UTF-8');
echo mb_convert_encoding('string em UTF-8', 'ISO-8859-1', 'UTF-8');

Conclusão

Tendo entendido o conceito de strings multibyte, fica bastante claro tanto o papel da extensão mbstring quanto vários problemas que nós já enfrentamos ao manipular caracteres acentuados, por exemplo.

Se você quiser aprender mais sobre manipulações de strings, encodings, charsets, PHP e mais assuntos relacionados a tecnologia, aqui está um cupom de desconto para assinar a Alura, plataforma de cursos online onde eu sou o instrutor da maioria dos cursos de PHP.