Question

Je suis tombé sur ce passage dans le Tutoriel Django:

Les modèles Django ont une valeur par défaut str() méthode qui appelle unicode() et convertit le résultat en chaîne d'octets UTF-8.Cela signifie qu'unicode(p) renverra une chaîne Unicode et str(p) renverra une chaîne normale, avec des caractères codés en UTF-8.

Maintenant, je suis confus car, autant que je sache, Unicode n'est pas une représentation particulière, alors qu'est-ce qu'une "chaîne Unicode" en Python ?Cela signifie-t-il UCS-2 ?La recherche sur Google est apparue ce "Tutoriel Python Unicode" qui déclare hardiment

Unicode est un codage sur deux octets qui couvre tous les systèmes d'écriture courants dans le monde.

ce qui est tout à fait faux, n'est-ce pas ?J'ai été souvent confus par des problèmes de jeu de caractères et d'encodage, mais ici, je suis sûr que la documentation que je lis est confuse.Est-ce que quelqu'un sait ce qui se passe en Python lorsqu'il me donne une « chaîne Unicode » ?

Était-ce utile?

La solution

qu'est-ce qu'une « chaîne Unicode » en Python ?Cela signifie-t-il UCS-2 ?

Les chaînes Unicode en Python sont stockées en interne soit sous forme UCS-2 (représentation 16 bits de longueur fixe, presque identique à UTF-16) ou UCS-4/UTF-32 (représentation 32 bits de longueur fixe).C'est une option au moment de la compilation ;sous Windows, il s'agit toujours de UTF-16, tandis que de nombreuses distributions Linux définissent UTF-32 (« mode large ») pour leurs versions de Python.

Vous n’êtes généralement pas censé vous en soucier :vous verrez les points de code Unicode comme des éléments uniques dans vos chaînes et vous ne saurez pas s'ils sont stockés sur deux ou quatre octets.Si vous êtes dans une version UTF-16 et que vous devez gérer des caractères en dehors du plan multilingue de base, vous vous tromperez, mais cela reste très rare, et les utilisateurs qui ont vraiment besoin de caractères supplémentaires devraient compiler des versions larges.

tout à fait faux, n'est-ce pas ?

Oui, c'est tout à fait faux.Pour être honnête, je pense que ce tutoriel est plutôt ancien ;il est probablement antérieur aux chaînes Unicode larges, sinon à Unicode 3.1 (la version qui a introduit des caractères en dehors du plan multilingue de base).

Il existe une source supplémentaire de confusion provenant de l'habitude de Windows d'utiliser le terme « Unicode » pour désigner spécifiquement le codage UTF-16LE que NT utilise en interne.Les gens de Microsoftland copient souvent cette habitude quelque peu trompeuse.

Autres conseils

Pendant ce temps, j'ai fait une recherche affinée pour vérifier ce qu'est la représentation interne en Python, et aussi quelles sont ses limites."La vérité sur Unicode en Python" est un très bon article qui cite directement les développeurs Python.Apparemment, la représentation interne est UCS-2 ou UCS-4 en fonction d'un commutateur au moment de la compilation.Alors Jon, ce n'est pas UTF-16, mais votre réponse m'a quand même mis sur la bonne voie, merci.

Python stocke Unicode au format UTF-16.str() renverra la représentation UTF-8 de la chaîne UTF-16.

Depuis Wikipédia sur UTF-8:

UTF-8 (format de transformation UCS/Unicode 8 bits) est un codage de caractères de longueur variable pour Unicode.Il est capable de représenter n'importe quel caractère de la norme Unicode, pourtant, le codage initial des codes d'octet et des attributions de caractères pour UTF-8 est rétrocompatible avec ASCII.Pour ces raisons, il devient progressivement l'encodage préféré pour les e-mails, les pages Web[1] et d'autres endroits où les caractères sont stockés ou diffusés.

Ainsi, il se situe entre un et quatre octets selon le caractère que vous souhaitez représenter dans le domaine Unicode.

De Wikipédia sur Unicode :

En informatique, Unicode est une norme industrielle permettant aux ordinateurs de représenter et de manipuler de manière cohérente du texte exprimé en la plupart des systèmes d'écriture du monde.

Il est donc capable de représenter la plupart (mais pas la totalité) des systèmes d’écriture du monde.

J'espère que ça aide :)

Alors, qu'est-ce qu'une "chaîne Unicode" dans Python?

Python « sait » que votre chaîne est Unicode.Par conséquent, si vous faites une regex dessus, il saura quel est le caractère et lequel ne l'est pas, etc., ce qui est vraiment utile.Si vous avez fait un strlen, cela donnera également le résultat correct.À titre d'exemple, si vous avez compté les chaînes sur Hello, vous obtiendrez 5 (même si c'est Unicode).Mais si vous avez compté la chaîne d'un mot étranger et que cette chaîne n'était pas une chaîne Unicode, vous obtiendrez un résultat beaucoup plus important.Pythong utilise les informations de la base de données de caractères Unicode pour identifier chaque caractère de la chaîne Unicode.J'espère que cela pourra aider.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top