Un de mes animaux de compagnie regarde tant de projets logiciels qui contiennent des montagnes de code pour la prise en charge des jeux de caractères. Ne vous méprenez pas, je suis pour la compatibilité et je suis heureux que les éditeurs de texte vous permettent d'ouvrir et d'enregistrer des fichiers dans plusieurs jeux de caractères. Ce qui m'agace, c'est comment la prolifération des encodages de caractères non universels est étiquetée «prise en charge Unicode appropriée» plutôt que «problème».
Par exemple, permettez-moi de choisir PostgreSQL et sa prise en charge des jeux de caractères . PostgreSQL gère deux types d'encodages:
- Encodage client: utilisé dans la communication entre le client et le serveur.
- Encodage serveur: utilisé pour stocker le texte en interne dans la base de données.
Je peux comprendre pourquoi la prise en charge de nombreux encodages client est une bonne chose. Il permet aux clients qui ne fonctionnent pas en UTF-8 de communiquer avec PostgreSQL sans avoir à effectuer eux-mêmes la conversion. Ce que je ne comprends pas, c'est: pourquoi PostgreSQL supporte-t-il plusieurs encodages de serveur ? Les fichiers de base de données sont (presque toujours) incompatibles d'une version PostgreSQL à la suivante, donc la compatibilité entre les versions n'est pas le problème ici.
UTF-8 est le seul jeu de caractères standard compatible ASCII qui peut coder tous les points de code Unicode (si je me trompe, faites le moi savoir). Je suis dans le camp que UTF-8 est le meilleur jeu de caractères, mais je suis prêt à accepter d'autres jeux de caractères universels tels que UTF-16 et UTF-32.
Je pense que tous les jeux de caractères non universels devraient être dépréciés. Y a-t-il une raison impérieuse de ne pas le faire?
la source
Réponses:
Puisque vous avez mentionné PostgreSQL, je peux dire avec une certaine autorité que la principale raison qui tue pourquoi les encodages côté serveur non UTF8 sont pris en charge de manière si détaillée est que les Japonais en ont besoin. Apparemment, une conversion aller-retour identique entre Unicode et les divers encodages "hérités" japonais n'est pas toujours possible, et dans certains cas, les tables de conversion sont même différentes d'un fournisseur à l'autre. C'est vraiment déroutant, mais c'est apparemment le cas. (La prise en charge étendue des jeux de caractères est également l'une des raisons pour lesquelles PostgreSQL est si populaire au Japon.)
Comme nous parlons d'un système de base de données, l'une des tâches principales est de pouvoir stocker et récupérer des données de manière fiable, comme défini par l'utilisateur, de sorte que la conversion de jeux de caractères avec perte ne volera pas parfois. Si vous avez affaire à un navigateur Web, par exemple, où tout ce qui compte vraiment est de savoir si le résultat semble correct, alors vous pourriez probablement vous en sortir avec moins d'encodages, mais dans un système de base de données, vous avez des exigences supplémentaires.
Certaines des autres raisons mentionnées dans d'autres réponses s'appliquent également comme arguments à l'appui. Mais tant que les Japonais y opposent leur veto, la prise en charge de la configuration des personnages ne peut pas être réduite.
la source
Deux raisons évidentes: selon les données que vous stockez, la conversion vers un format différent peut prendre un peu de temps et d'espace supplémentaire. Si vous stockez 400 mégaoctets d'informations, doubler les besoins de stockage n'est pas un problème - mais si vous stockez 400 téraoctets, cela commence à signifier un peu plus. La conversion de 400 téraoctets de données de (disons) Shift-JIS en UTF-x pourrait également prendre un peu de temps.
Cela devient particulièrement difficile si vous avez (par exemple) des garanties de disponibilité qui disent que la base de données sera disponible pour tous mais, disons, 10 minutes sur une année donnée, et que vous avez une base de données qui est mise à jour plusieurs centaines de fois par seconde. Attention, il est toujours possible de gérer des conversions majeures dans une telle situation, mais ce n'est pas quelque chose à entreprendre à la légère. Dans certains cas, il pourrait facilement prendre des années de planification pour se préparer à une telle conversion.
Si vous débutiez avec une base de données qui (par exemple) ne supportait que l'ASCII, il pourrait y avoir de bonnes raisons de débattre de la pertinence d'ajouter la prise en charge de tous ces encodages - mais si vous les supportez déjà, il n'y a pas grand-chose à gagner à abandonner soutien pour eux.
Notez, en particulier, que vous gagneriez probablement presque rien dans la manière de simplifier le code, ou quelque chose comme ça. De toute façon, ils auraient besoin de toutes les routines de conversion pour gérer les conversions entre le client et le serveur. En tant que tel, la suppression du support signifierait la suppression d'un appel de fonction (mineur) dans les chemins "d'écriture sur le disque" et de "lecture à partir du disque", mais peu (le cas échéant). Si vous preniez en charge même deux encodages sur le disque, vous n'y gagneriez même pas - vous auriez toujours l'appel de fonction là-bas, donc tout ce que vous feriez vraiment serait de restreindre la plage d'encodages pris en charge par cette fonction.
Au moins, si je concevais cela, j'écrirais probablement le cœur de la base de données pour travailler dans UCS-4, puis j'aurais des routines de conversion entre le cœur et le disque, et entre le cœur et l'utilisateur. J'utiliserais le même ensemble de routines dans les deux cas, donc la voie la plus simple serait de permettre au stockage sur disque d'utiliser exactement le même ensemble d'encodages que les clients étaient autorisés à utiliser.
la source
Il y a quelques problèmes avec seulement le stockage UTF-8 sur le serveur:
VARCHAR(20)
colonne? S'agit-il de 20 octets, ou 20 "caractères" (et en Unicode, qu'est-ce qu'un "caractère" lorsque vous prenez en compte la combinaison de caractères, de ligatures, etc.?). Pire, qu'en est-il de l'CHAR(20)
endroit où il doit réellement réserver tout l'espace possible: je crois en MySQL, il réserve 4 fois le nombre d'octets pour une colonne encodée UTF-8 (donc 80 octets pourCHAR(20)
) juste pour gérer le pire des cas.Cela dit, je suis d'accord avec vous: les encodages hérités sont pour la plupart inutiles et Unicode est généralement le meilleur encodage à utiliser pour toutes les nouvelles applications. Si j'écrivais un serveur de base de données à partir de zéro aujourd'hui, je prendrais uniquement en charge Unicode et ne prendrais en charge aucun encodage hérité.
La différence est que PostgreSQL et la plupart des autres serveurs de bases de données utilisés aujourd'hui existaient avant qu'Unicode ne soit une option viable. Donc, ils avaient déjà pris en charge les encodages hérités (ils n'étaient pas hérités à l'époque, bien sûr) et il n'y a tout simplement pas beaucoup d'intérêt à déchirer tout ce code pour des raisons largement idéologiques.
la source
Les codages non universels (et spécifiquement à un octet) ont leur place: sur les systèmes qui:
C'est vrai aujourd'hui pour certains types d'appareils intégrés. Mais sur le bureau et dans la salle des serveurs, les encodages non Unicode devraient être obsolètes depuis longtemps .
la source
UTF-8 est le meilleur pour vous anglophone égocentrique 1 . Si vous étiez japonais, environ 99% de vos personnages prendraient 3-4 octets au lieu de deux en UTF-16.
Les dialectes non latins souffrent vraiment de l'UTF-8 au niveau de la taille. N'oubliez pas que d'ici quelques années, la plupart de vos clients pourraient être chinois, et l'écriture chinoise a des millions de caractères. Vous ne pouvez pas supporter cela efficacement avec UTF-8.
Sinon, je déteste quand j'ai des documents texte qui ne sont pas en UTF - quelque chose . Je vais souvent m'éloigner si j'ai besoin d'avoir un bon encodage. Dans mon livre, les encodages non Unicode sont morts.
1. Ne prenez pas personnellement la partie égocentrique. Je voulais faire une illustration colorée et je ne le pense pas vraiment.
la source
Unicode est fondamentalement cassé et il est peu probable qu'il ait jamais été corrigé. Il doit être remplacé par quelque chose de mieux, quelque chose de vraiment universel. Si quelque chose doit être déconseillé, c'est Unicode.
Exemples de problèmes avec Unicide:
UTF8 est un hack raisonnable, mais la plupart des logiciels basés sur UTF16 sont cassés. La plupart des applications Windows qui prennent en charge Unicode utilisent UTF16, y compris le système d'exploitation lui-même. Le problème le plus courant ne prend pas en charge plus que le plan de base, c'est-à-dire les caractères multi-mots.
L'unification des Han est un désastre absolu. Il est impossible de mélanger du texte japonais / chinois / coréen dans un seul document sans métadonnées supplémentaires, et difficile de détecter la police à utiliser.
Les personnages multinationaux sont un autre désastre. Des schémas de codage plus judicieux mappent un caractère à un code, ce qui rend le traitement des chaînes relativement sain. Unicode ne fonctionne pas. Unicode n'est même pas cohérent - les caractères Han sont principalement des combinaisons, mais ne sont pas codés en tant que tels, contrairement aux caractères combinatoires européens.
Les noms de certaines personnes ne peuvent pas être écrits correctement en Unicode, ou sont très susceptibles d'être rendus incorrectement en raison des problèmes mentionnés ci-dessus. Cela peut avoir de graves conséquences, par exemple lorsque vous essayez d'embarquer dans un avion avec un passeport qui ne correspond pas à ce qui est (incorrectement) imprimé sur le billet.
En raison de ces problèmes et bien plus, de nombreux logiciels non anglais ne peuvent pas utiliser Unicode et s'appuient sur des encodages de caractères locaux. Cela est particulièrement courant avec les logiciels japonais et chinois.
Idéalement, Unicode devrait être obsolète. Le codage de caractères TRON est un assez bon remplacement pour Unicode et largement compatible avec les logiciels existants qui ne seront pas mis à jour.
la source
Peut-être pour écrire, mais pas pour lire.
Il y a beaucoup de contenu existant qui utilise ces encodages, et certains encodages comme base64 ne vont nulle part parce que certains protocoles de texte les obligent à incorporer des données binaires.
Un vrai problème est la détection automatique des encodages qui conduit à des failles de sécurité. Cela ne me dérangerait pas de voir certains encodages obscurs comme UTF-7 disparaître.
La détection automatique a également tendance à mal gérer le contenu produit par la concaténation naïve de chaînes d'octets.
la source
Je peux convenir que le codage de caractères par défaut pour les bases de données et les nouvelles applications devrait être une sorte de variante UTF. Personnellement, j'opterais pour UTF-16 car il semble que ce soit un compromis raisonnable en termes d'espace et de complexité (plus que UTF-8). Cela dit, certains encodages de caractères ont toujours un sens dans certains cas.
Notez qu'il existe 4 algorithmes de normalisation UTF standard. Si vous êtes préoccupé par les caractères multi-points de code, vous pouvez utiliser l'un des deux algorithmes de normalisation qui les réduisent en caractères mono-points de code équivalents. La différence entre eux a à voir avec l'équivalence logique contre l'équivalence physique des personnages.
la source