Pergunta

Nos últimos dias, tenho trabalhado para converter minha base de código PHP de Latin1 para UTF-8. Eu li que as duas principais soluções são substituir as funções de bytes únicas pelas funções multibyte incorporadas ou definir o valor mbstring.func_overload no arquivo php.ini.

Mas então eu me deparei isto O Thread on Stack Overflow, onde a postagem de Thomasrutter parece indicar que as funções multibytes não são realmente necessárias para o UTF-8, desde que o script e os literais da string sejam codificados no UTF-8.

Não encontrei nenhuma outra evidência se isso é verdadeiro ou não, e se for o caso, não preciso converter meu código para as funções MB_, isso seria um economizador em tempo real! Alguém capaz de lançar alguma luz sobre isso?

Foi útil?

Solução

Tanto quanto eu entendo o problema, desde que todos os seus dados estejam 100% no UTF -8 - e isso significa entrada do usuário, banco de dados e também a codificação dos arquivos PHP se você tiver caracteres especiais - isso é verdadeiro Verdadeiro para operações de pesquisa e comparação. Como @ntd aponta, um strlen não multibyte () produzirá resultados errados quando executado em uma string que contém caracteres multibyte.

Isto é um ótimo artigo sobre o básico da codificação.

Outras dicas

Eles não são "necessários", a menos que você esteja usando algum dos funções que eles substituem (e é provável que você são usando pelo menos um desses) ou de outra forma precisa explicitamente um recurso da extensão, como Manuseio HTTP.

Ao trabalhar para a conformidade da UTF-8, eu sempre volto ao PHP UTF-8 Cheatsheet com uma adição: os padrões de PCRE precisam ser atualizados para usar o u modificador.

Assim que você estiver examinando ou modificando uma sequência multibyte, você precisa usar uma função MB_*. Um exemplo muito rápido que demonstra o porquê:

$str = "abcžđščćöçefg";
mb_internal_encoding("UTF-8");

echo "strlen: ".strlen($str)."\n";
echo "mb_strlen: ".mb_strlen($str)."\n";

Isso imprime:

strlen: 20
mb_strlen: 13

Thomasrutter indica que o procurar não precisa de manuseio especial. Por exemplo, se você precisar verificar o comprimento de uma string utf8, não vejo como você pode fazer isso usando simples strlen().

Funções como MB_Strtoupper também podem ser necessárias. Strtoupper não se converte a para á.

Existem várias funções que esperam que as strings sejam bytes únicas (e algumas até presumem que é ISO-8859-1). Nesses casos, você precisa estar ciente do que está fazendo e possivelmente usar funções de reposição. Há uma lista bastante abrangente em: http://www.phpwact.org/php/i18n/utf-8

Você pode usar a biblioteca MBFunctions que estende as funções multibyte no PHP:

http://code.google.com/p/mbfunctions/

Você pode usar issohttp://php.net/manual/en/mbstring.overload.phpDefinir o arquivo php.ini, para que você não precise alterar seu código.

Mas tenha cuidado, porque nem toda a função de string será alterada automaticamente. Isso é um: http://php.net/manual/en/function.substr-replace.php

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top