42 votes

Quels sont les facteurs qui font de PHP Unicode incompatibles?

Je suis en mesure d'utiliser les caractères UTF-8 très bien dans mes scripts.

Comme une question de fait, il est possible d' avoir des noms de variables et de fonctions qui contiennent des caractères Unicode.

Il y a aussi le mb_string extension qui traite avec multi-chaînes d'octets, mais dans d'innombrables articles de PHP est critiqué pour son manque de support de l'Unicode.

Je ne comprends pas; pourquoi est-PHP a dit de ne pas en charge les caractères Unicode?

45voto

Michael Stum Points 72046

Lors de PHP a été commencé il y a plusieurs années, l'UTF-8 n'a pas été vraiment pris en charge. Nous parlons d'un temps où les non-Unicode OS comme Windows 98/Me était encore d'actualité et lorsque les autres grandes langues comme Delphes, sont également non-Unicode. Pas toutes les langues ont été conçus avec l'Unicode dans l'esprit du jour 1, et de changer complètement votre langue en Unicode sans casser beaucoup de choses est difficile. Delphi n'est devenue compatible Unicode a un an ou deux par exemple, tandis que d'autres langages comme Java ou C# ont été conçus en Unicode à partir du Jour 1.

Ainsi, lorsque PHP a grandi et est devenu PHP 3, PHP 4 et maintenant, PHP 5, il suffit de pas on a décidé d'ajouter Unicode. Pourquoi? Sans doute pour éviter compatible avec les scripts existants ou parce que utf8_de/encoder et mb_string existait déjà et de travail. Je ne sais pas pour vous, mais je crois fortement qu'il a quelque chose à voir avec la croissance organique. Caractéristiques n'existent simplement par défaut, ils doivent être écrit par quelqu'un, et qui n'a tout simplement pas se produire pour de PHP pour le moment.

Edit: Ok, j'ai lu la question mal. La question est: Comment sont les chaînes stockées en interne? Si je tape "Währung" ou "Écriture", dont l'Encodage est utilisé pour créer les octets utilisés? Dans le cas de PHP, c'est l'ASCII avec une page de Codes. Cela signifie que: Si je encoder la chaîne à l'aide de l'ISO-8859-15 et vous le décoder avec quelques chinois de page de codes, vous obtiendrez des résultats bizarres. L'alternative est dans des langages comme C# ou Java, où tout est stocké en Unicode, ce qui signifie: Il n'y a pas de page de codes, et de plus, théoriquement, vous ne pouvez pas gâcher. Je vous recommande de Joel article sur Unicode et les Jeux de Caractères, mais en gros, ça se résume à: Comment sont des chaînes de caractères stockées en interne, et la réponse avec PHP "n'est Pas en Unicode", ce qui signifie que vous devez être très prudent et explicite lors du traitement de chaînes assurez-vous de toujours garder la chaîne dans le bon encodage lors de la saisie, de stockage de données (base de données) et de sortie, ce qui est très susceptible de causer des erreurs.

36voto

flow Points 1376

je crois que c'est en grande partie une difficulté culturelle, pas technique.

comme pour les problèmes techniques---et ce n'est pas carrément tout-trivial à mettre en œuvre l'unicode dans un écosystème construit sur l'hypothèse que "l'un caractère correspond à un octet'---les développeurs pourraient avoir copié beaucoup de java ou python efforts (ce dernier avec décent et largement travailler compatibilité unicode depuis 2001), mais ils ne l'ont jamais fait.

quand j'ai lu le fil de discussion attachée à l'officiel, documentation en cours pour php utf8_encode() de la fonction, j'obtiens un sentiment de vertige.

firstoff, cette fonction est appelée utf8_encode(); toutefois, la documentation indique que la chaîne qu'elle attend est prévu pour être dans la norme ISO-8859-1 (un.k.un. latin-1). c'est vraiment très php, c'est vraiment très années 80.

la plupart des commentateurs semblent percevoir unicode comme un fardeau. il existe de nombreuses propositions de comment faire pour convertir des chaînes "de l'inconnu du contenu, la façon de traiter avec s'strings avec un mélange de codages' (wtf?), ou de traiter avec les codepoints que normalement entraîner la rupture parce qu'ils sont au-delà de cette fonction de quatre octets par codepoint limite.

la discussion est centrée autour de corrections pour se débarrasser de gribouillis ou pour éviter la problématique des pièces de la fonction du comportement. et qui, pour moi, est vraiment très php: tout le monde est juste faire de bugs, peu de choses sont mises en œuvre dans un de fondamentalement bon sens. si vous pensez que la calomnie, de mon côté, voici quelques bribes:

Bien que cela semble casser allemand Umlaute [aou] si le document est déjà en UTF-8.

(à défaut de comprendre que l'utf-8 n'est pas conçu pour fonctionner lorsqu'il est appliqué deux fois)

Regardez fonction iconv (), qui offre un moyen de convertir de 8859 et redouté 1252 en UTF8

(bon point: neglection de l'état de la technique sur une partie des développeurs php; au lieu de cela, buggy propre mise en œuvre)

l'utilisation de preg_match pour détecter si utf8_encode est nécessaire [...] à l'exclusion des mères porteuses [...] à l'exclusion de overlongs

(ce qui suggère silencieusement effacer tout le contenu problématique de cordes, laissant seulement ces choses qui ne cassent pas utf8_encode(); cela peut rendre les textes illisibles (ou disparaître complètement), mais bon, plus de messages d'erreur)

pour encoder une chaîne uniquement si il n'est pas encore UTF-8 [...] mb_detect_encoding($s, "UTF-8")

(comme l'a souligné par un autre intervenant, ce n'est pas d'aller travailler:

$str = 'áéóú'; // ISO-8859-1
mb_detect_encoding($str, 'UTF-8'); // 'UTF-8'
mb_detect_encoding($str, 'UTF-8', true); // false

donc, ici, nous sommes à la recherche à un bug d'être remplacé par un autre. heureux de chasse. aussi, ce qu'ils semblent proposer ici est de résoudre un problème à l'aide de l'heuristique (lente, incertaine) signifie que l'on pourrait et devrait être résolu avec la mécanique (rapide, sûre) moyens)

utf8_[coder|décoder] sera en fait à traduire windows-1252 caractères, et pas seulement à partir de/à la norme ISO-8859-1 comme le dit la documentation

(vous ne pouvez pas toujours compter sur la documentation officielle de php pour être clair ou exhaustive---vous devez toujours lire grâce à des années d'expérience des utilisateurs qui n'auront jamais de feed-back pour les docs)

J'ai travaillé sur un is_utf8 fonction et je voulais le poster ici, en plus des autres, j'ai également pris en considération les 5000 char bug

(un correctif pour un problème qui en grande partie n'existe que parce que l'unicode n'est pas correctement mis en œuvre. nous apprenons aussi que non seulement l' utf8_encode() fonction de donner au-delà de 4 octets par codepoint, il sera également se briser si le (ou la sortie?) texte dépasse une limite de 5000 caractères)

je pourrais continuer comme ça. vous avez déjà eu l'idée: à en juger par ce fil, la communauté php simplement ne sonne pas comme ils sont partout, prêt à saisir ce que les codages et les jeux de caractères sont tout au sujet, ce qu'il faut pour construire une infrastructure solide en général ou, plus précisément, de mettre en œuvre l'unicode dans une manière appropriée. au lieu de cela, ils utilisent leurs échafaudages, leurs cartons, leurs clous et de marteaux, et d'aller sur la construction de ce grand édifice appelé php, jetant leurs ruban adhésif à tous les problèmes qui ne peuvent pas être annulés avec un autre clou. bien sûr, il va souffrir de chaque vent qui vient à souffler, comme les occasionnels juridique mais caractère inattendu.

voir ce thread particulier d'être actif pendant huit ans, ne correspond pas exactement à insuffler de la confiance de la situation va être de mieux en huit ans à partir de maintenant.

5voto

Michael Borgwardt Points 181658

Vous le dites vous-même: dans le but de traiter correctement les chaînes qui contiennent des caractères multioctets, vous devez utiliser une rallonge. Oublier n'importe où pour utiliser les fonctions d'extension au lieu de la plus familier "normal", et vos données sont mutilés. La même chose se produit si vous utilisez une bibliothèque tierce, qui n'a pas été mis à jour pour utiliser la fonction d'extension de partout.

Aussi, un certain nombre d' extrêmement populaire encodages est toujours explicitement pas pris en charge par PHP, sans doute parce qu'il est impossible de le faire et de rester en bas-compatible.

3voto

VolkerK Points 54118

De nombreuses extensions courantes n'ont pas de support de l'unicode ou (pire encore) de "besoin de savoir" qu'une chaîne contient des caractères unicode/utf-8 séquences, comme par exemple XMLReader. Et il peut faire tout à fait une différence si PHP glob() appelle FindFirstFileA ou FindFirstFileW sur win32.
Un autre (beaucoup plus petit, mais étonnamment souvent être la source de gêne) question sont des Nomenclatures qui PHP ne reconnaissent pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X