Por que exatamente o PHP não pode ter suporte unicode completo?


18

Todo mundo sabe que o PHP tem problemas com o Unicode. A versão 6 é efetivamente abandonada, devido a dificuldades de implementação do Unicode. Mas me pergunto se alguém sabe quais são as razões exatas . Problemas de arquitetura / design, problemas de desempenho, problemas da comunidade (aposto que não), alguma outra coisa?

Respostas:


16

Definitivamente, o PHP como linguagem pode tê-lo, mas acho que o problema está na compatibilidade com os programas existentes. O suporte a Unicode pode quebrá-los de maneiras sutis, que é o tipo de bug mais irritante de se ter.

Atualmente, a maioria das funções de processamento de strings no PHP são "seguras em binários", o que significa que você pode usá-las para processar qualquer arquivo em qualquer codificação, bem como em formatos binários como dados de imagem, etc.

Com a adição de cadeias Unicode, você deve ter muito cuidado para não misturar cadeias Unicode com cadeias binárias (bastante difícil quando suas cadeias vêm de fontes diferentes e você nunca teve que se preocupar com isso antes). E você não podia mais ignorar as codificações (e muitos scripts ignoram isso!)

Outro problema difícil, mas solucionável, é o acesso aleatório em cadeias de caracteres Unicode. Implementação de $string[$offset]alterações de trivial para muito lento ou pouco lento e muito complexo.

Também acho que foi um erro escolher UTF-16 como codificação interna para PHP. Tem os mesmos problemas que o UTF-8 (largura variável por causa dos pares substitutos) e a ineficiência do UCS-2. Talvez eles devessem descartar isso e começar de novo com UTF-8?

</speculation>


2
concordo totalmente com a mudança para utf8.
GrandmasterB

você acha que o UTF-16 é, além do tamanho dos blocos de dados, pior que o UTF-8?
ts01

3
@ Dean Harding: Não estou dizendo que é impossível trabalhar com UTF-16, apenas que o acesso aleatório (em O (1) ) não é possível. O UTF-16 não garante que o 100º ponto de código inicie no 200º byte; portanto, para acessar o 100º ponto de código, é necessário verificar linearmente todos os anteriores (e uma boa implementação armazenaria em cache o resultado, é claro). Nesse sentido, é semelhante ao UTF-8 (ou seja, o acesso ao n-ésimo caractere / código de código é O (n) , não O (1) ).
Kornel

1
@ Dean: Coisas como agrupamento ou conversões entre UTF-16 e UTF-8 certamente não funcionam da mesma forma para os substitutos do que para a combinação de caracteres.
dan04

3
Um excelente resumo sobre os motivos da escolha de UTF-8 em vez de UTF-16 (ou qualquer outra codificação) pode ser encontrado em utf8everywhere.org .
Joachim Sauer

11

TLDR: muitas bibliotecas PHP são apenas uma camada fina sobre as bibliotecas C nativas que não suportam unicode, ou suportam de maneiras incompatíveis entre si. A retificação dessa situação provavelmente introduzirá mudanças incompatíveis com versões anteriores.

AVISO LEGAL: como mudei do PHP para o Python (para nunca olhar para trás) há alguns anos, minha opinião é claramente tendenciosa.

Eu acho que o PHP é um truque legal e inteligente. Como um hack, começou despretensioso e cresceu um pouco caoticamente a partir de um monte de bibliotecas esparsas - sem um design bem pensado e unificado (da perspectiva da teoria da linguagem de computador).

Como disse Maquiavel, "aquele que ainda não lançou suas fundações poderá, com grande habilidade, lançá-las depois, mas elas terão problemas para o arquiteto e perigo para o edifício".

Para uma linguagem de programação, quanto mais popular, mais difícil é mudar. É por isso que idiomas como C mudam a cada 10 anos. Por exemplo, o Python 3 fez muitas alterações incompatíveis com versões anteriores, e não foi bonito. O suporte a unicode nas encarnações anteriores do Python já era considerado superior ao estado atual do PHP, mas adivinhe: as mudanças mais polêmicas no Python 3 estão relacionadas ao manuseio do unicode. Este discurso de Armin Ronacher resume a frustração de uma grande parte da comunidade Python.

O PHP sendo "a" plataforma onipresente da Web faz com que seja vítima de seu próprio sucesso. Trazer suporte unificado para unicode em PHP é inevitável, mas exigirá muito sangue, suor e lágrimas.


bem, todo mundo concorda aqui, suponho. Mas eu estava perguntando os detalhes;)
ts01

3
O problema é que muitas bibliotecas subjacentes não lidam bem com o Unicode e é muito difícil resolver o problema sem começar do zero.
Paulo Scardine

(FYI, "desde há alguns anos", PHP começou melhor e Python pior)
ZJR

1
@ZJE: É bom saber, obrigado. Você teria a gentileza de me indicar algum material de referência sobre essa mudança?
Paulo Scardine

6

Um dos principais motivos pelos quais o antigo trabalho do PHP 6 foi interrompido foi devido à complexidade interna que trouxe e à quantidade de trabalho a ser realizado, que quase ninguém entendeu completamente.

Um pouco de história: a implementação de Unicode do PHP 6 foi projetada pela necessidade de um usuário maior de PHP e tentou fazer o Unicode "certo". Após alguma avaliação, o criador principal do suporte a ser Unicode do PHP optou por adicionar um novo tipo de string que internamente é o Utf-16 e permitir que diferentes codificações sejam usadas em locais diferentes. Portanto, o código pode ser escrito em uma codificação, a saída pode usar uma codificação diferente e "operações runtme" em outra codificação. A razão para escolher o UTF-16 foi que o trabalho deveria se basear no livrário da UTI que usa o UTF-16 e verificou-se que essa codificação faz operações comuns de cadeias de maneira rápida, enquanto a conversão entre utf e utf-16 é relativamente barata. . Por enquanto, tudo bem.

Agora, a consequência de fazer isso é principalmente a introdução de um novo tipo de string. O sistema de tipos internos do PHP até então tinha alguns tipos (NULL, bool, int / long, float / double, string, array, recurso, objeto) e muitos códigos tinham algumas suposições quanto a esse caso. Além de tais suposições, todas as funções que operam em strings, e há muitas, precisam ser avaliadas individualmente e precisa ser decidido como lidar com codificações. Eles devem trabalhar em cadeias binárias ou unicode? Se for necessária uma conversão, qual codificação deve ser usada etc. e isso é muito trabalhoso e, em alguns casos, bastante complicado de se fazer o certo. Além disso, as APIs internas tornaram-se bastante complicadas, pois a maioria das principais APIs do PHP obteve versões para cadeias binárias (a antiga) e, em seguida, frequentemente uma versão para cadeias "codificadas em tempo de execução",

Ao longo do processo, muitos desenvolvedores se depararam com a coplexidade, ficaram aborrecidos com o utf-16 e não gostaram do fato de que isso iria mais do que duplicar o uso de memória e gastar muito tempo convertendo strings e quebrando a maioria dos aplicativos existentes. Portanto, sendo o PHP conduzido por voluntários, cada vez menos desenvolvedores estavam trabalhando nele e outras coisas se acumulavam e os colaboradores ficaram infelizes e, no final, tiveram que ser abandonados.

Agora, o que o futuro pode trazer? - Há uma lenta evolução acontecendo, que mais e mais coisas no PHP são construídas em torno do utf-8. Não de uma maneira forte, com um tipo personalizado e forçando tudo, e atualmente os desenvolvedores não estão motivados a tocar esse ferro quente. Pode-se esperar que alguém tenha uma boa proposta para que funcione bem, mas atualmente "todo mundo" foge se ouvir apenas a palavra. :)


1

Eu acho que o motivo real é que a equipe de desenvolvimento do PHP não possui um roteiro claro para o desenvolvimento do PHP (vamos apenas mencionar uma discussão bastante acalorada quando alguém no php-internals decidiu iniciar o ramo do PHP 5.4 sem concordar previamente com os recursos que o 5.4 deveria conter). Eu gosto muito dessa linguagem, mas o modo como ela está sendo desenvolvida me deixa um pouco preocupado.


2
Deixei o PHP para Python em 2006 depois de usá-lo por 5 anos sólidos - o Python tem um processo de desenvolvimento incrível e boa liderança - além disso, a linguagem é muito mais concisa, poderosa e consistente do que o PHP. O principal desafio é encontrar a estrutura da web certa. Nós lançamos nosso próprio - AppStruct.
gahooa

1
Bem, tínhamos um roteiro para o PHP 6. Não ajudou;) Uma das questões do roteiro é que o PHP é conduzido por voluntários que aparecem (e se eles têm "boas idéias", queremos mantê-los e adicionar seus recursos em breve) e desaparecer repentinamente (casar-se, mudar de emprego, ...)
johannes

Felizmente, o PHP 7 é um sucesso.
danger89

5 anos depois e ainda sem 'suporte completo ao unicode' :) #
1319
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.