Pergunta

Hoje eu tive um problema com o strpos() função php porque retornou FALSE mesmo que o resultado correto era obviamente 0. Isto porque um parâmetro foi codificado em UTF-8, mas o outro (de origem é um HTTP GET parâmetro) obviamente, não.

Agora, tenho notado que usando a função mb_strpos resolveu o meu problema.

A minha pergunta agora é: Será que com sabedoria para usar as funções de string multibyte do PHP em geral para evitar problemas de teses no futuro? Devo evitar o strpos tradicional, strlen, ereg, etc., etc. funções em tudo?

Aviso: Eu não quero conjunto mbstring.func_overload global em php.ini, porque isso leva a outros problemas ao usar a biblioteca PEAR. Eu estou usando PHP4.

Foi útil?

Solução

Depende da codificação de caracteres que você está usando. Na codificação de caracteres de byte único, ou UTF-8 (onde um único byte dentro de um personagem nunca pode ser confundido com outro personagem), então, enquanto a seqüência que você está procurando e da corda que você está usando para procurar estão na mesma codificação, então você pode continuar a usar as funções de pesquisa regular de string.

Se você estiver usando uma multi-byte codificação diferente de UTF-8, o que não impede bytes individuais dentro um personagem de aparecendo como outros personagens, então nunca é seguro fazer uma pesquisa de seqüência usando as funções de pesquisa seqüência regular. Você pode encontrar falsos positivos. Isto é por causa de comparação de cadeia do PHP em funções tais como strpos é por-byte, e com a excepção de UTF-8, que é especificamente concebido para evitar este problema, codificações de multi-byte sofrer o problema de que qualquer byte subsequente num personagem constituído por mais de um byte pode coincidir com parte de um personagem diferente.

Se o texto que você está procurando em e a cadeia de caracteres que você está procurando são de diferentes codificações de caracteres, em seguida, a conversão será sempre necessário. Caso contrário, você vai descobrir que para qualquer cadeia que seria representado de forma diferente na outra codificação, ele sempre retornará false. Você deve fazer essa conversão na entrada: decidir sobre a codificação de caracteres que a sua aplicação vai usar, e ser consistente dentro do aplicativo. Toda vez que você receber a entrada em uma codificação diferente, converso sobre a forma.

Outras dicas

Houve alguns problemas com os mb_ * funciona em versões do PHP anteriores a 5.2. Portanto, se seu código vai em múltiplas plataformas com diferentes versões do PHP, o estranho comportamento pode ocorrer. Além disso função das mb_ strpos é bastante lento, tem que pular o número de caracteres especificados pelo parâmetro de deslocamento para obter a posição byte verdadeira usado internamente. Em loops, dependendo das strpos / mb_strpos funcionalidade isso pode se tornar um grande gargalo.

Se você usar a mesma codificação em todos os lugares que geralmente não é um problema. Eu uso UTF-8 para todas as minhas páginas, e nunca realmente encontrei este problema. No final, ele realmente se resume a especificar a mesma codificação para as páginas e banco de dados.

Por exemplo:

header('Content-type: text/html;charset=utf-8');
mysql_query('SET NAMES utf8');

Na maioria dos casos, isso significa que todas as fontes de dados para a aplicação vai entregar dados na mesma codificação, e, assim, você vai evitar este tipo de problemas.

Isso tudo vai ser muito melhor com o advento PHP 6, btw, uma vez que irá incluir unicode-apoio.

Você não necessariamente tem que usar mb_strpos, mas você precisa ter certeza de que todos os dados em seu aplicativo é o mesmo: ou um mb_string, ou uma seqüência simples de uma codificação específica. (Normalmente UTF-8).

Se você certificar-se de suas páginas são UTF-8, e seus envios de formulários são interpretados como UTF-8, e suas lojas de banco de dados UTF-8, você geralmente ser OK. operações de cadeia indexado (em particular, truncagens) pode quebrar uma sequência UTF-8, que é importuno mas geralmente não desastroso. Se você precisa fazer esse nível de apoio, mb_strings são sua única opção (mas é claro que você tem que ter certeza de que todas as partes do seu aplicativo e bibliotecas e versão do PHP pode lidar com eles adequadamente).

O desenvolvimento de sites que lidam com Unicode corretamente no PHP não é muito divertido agora: o seu apoio Unicode é muito baixa comparado com linguagens como Python e .NET. Espera-se PHP6 vai melhorar a situação.

Eu recomendaria utilizando o seguinte biblioteca UTF-8 PHP:

http://sourceforge.net/projects/phputf8

Agregação-lo com o seu aplicativo solta requisitos da sua aplicação por não exigir a extensão mbstring, mas você ainda tem funções UTF-8 cordas.

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