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 de les 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?
Vous devez vous connecter pour publier un commentaire.
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 recommande Joël 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.
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 de php
utf8_encode()
function, 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:
(à défaut de comprendre que l'utf-8 n'est pas conçu pour fonctionner lorsqu'il est appliqué deux fois)
(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)
(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)(comme l'a souligné par un autre intervenant, ce n'est pas d'aller travailler:
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)
(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)
(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.
de 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.
Le concept de "caractères codés sur plusieurs octets" est au cœur du problème.
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 de extrêmement populaire encodages est toujours explicitement pas supportés par PHP, sans doute parce qu'il est impossible de le faire et de rester en bas-compatible.
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.
De nombreuses fonctions de chaîne sont juste minces wrappers autour de la bibliothèque C équivalents, qui traitent également tout comme une séquence d'octets. Une autre raison est que PHP porte autour d'un lot de inutile de compatibilité descendante, les bagages et ainsi de coincer avec de mauvaises décisions de conception à partir de 3&4.
Peut-être avec 5,3 s espaces de noms qu'ils vont enfin avoir un moyen de suppression progressive de l'ancien fonctions.
Ce que l'on entend par "support" est "la prise en charge native'. Jetez un oeil à cette pour obtenir des informations détaillées.