Ce codage ne normal python chaînes utiliser?
je sais que django utilise des chaînes unicode tous les coins du cadre au lieu de la normale python cordes. ce codage est normal python chaînes utiliser ? et pourquoi ne pas utiliser l'unicode?
Vous devez vous connecter pour publier un commentaire.
De Python 3.0 sur toutes les chaînes de caractères unicode par défaut, il y a aussi les octets de type de données (La documentation Python).
De sorte que le python développeurs pensent que l'utilisation d'unicode est une bonne idée, qu'il n'est pas utilisé de manière universelle en python 2 est principalement en raison de la compatibilité ascendante. Il a aussi des implications sur les performances.
bytes
n'est pas tout à fait la même sémantique que 2.xstr
.bytes
vous donne ints au lieu de la longueur-1bytes
cas, autoconversion est allé (dieu Merci),bytes
etstr
ne partagent plus d'une classe de base.En Python 2: Normal cordes (Python 2.x
str
) n'ont pas de encoding: ils sont des données brutes.En Python 3: on les appelle les "octets", qui est une description précise, comme ils sont tout simplement des séquences d'octets, qui peut être du texte encodé en tout encodage (plusieurs sont communes!) ou non des données textuelles complètement.
Pour représenter texte, vous voulez des chaînes unicode, pas de chaînes d'octets. Par "chaînes unicode", je veux dire
unicode
instances en Python 2 etstr
instances en Python 3. Des chaînes Unicode sont des séquences d'unicode codepoints représentée de façon abstraite, sans un encodage; il est bien adapté pour la représentation de texte.Bytestrings sont importants parce que représentent les données pour la transmission sur un réseau ou en écriture à un fichier ou que ce soit, vous ne pouvez pas avoir une représentation abstraite de l'unicode, vous avez besoin d'une représentation concrète d'octets. Même s'ils sont souvent utilisés pour stocker et représenter le texte, c'est au moins un peu coquine.
Toute cette situation est compliquée par le fait que, tandis que vous devrait tour unicode en octets par l'appel de
encode
et tourner les octets en unicode à l'aide dedecode
, Python vais essayer de le faire automatiquement pour vous à l'aide d'un mondial de l'encodage, vous pouvez définir qui est par défaut ASCII, qui est le choix le plus sûr. Ne jamais dépendre de votre code et de ne plus jamais le changer pour un plus flexible de codage--explicitement décoder lorsque vous obtenez une bytestring et encoder si vous avez besoin d'envoyer une chaîne de caractères quelque part externes.Hey! Je voudrais ajouter quelques trucs pour les autres réponses, malheureusement je n'ai pas assez de rep encore de le faire 🙁
FWIW, Mike Graham post est assez bonne et c'est probablement ce que vous devriez être en première lecture.
Voici quelques commentaires:
from __future__ import unicode_literals
# -*- coding: utf-8 -*-
. Pour plus d'informations, voir PEP 0263. Modification de la source de codage affecte la façon dont Unicode littéraux (indépendamment de leur préfixe ou de l'absence de préfixe, comme touchés par le point 1) sont interprétées. Dans Py3k, par défaut le fichier est encodé en UTF-8.str
dans py3k,unicode
en 2.x) parce qu'à un certain point dans le temps des trucs va être écrit à la mémoire. Idéalement, ce ne serait jamais évident pour l'utilisateur final. Malheureusement, rien n'est parfait et vous pouvez parfois rencontrer des problèmes avec ce: en particulier si vous utilisez funky gribouillis à l'extérieur de l'Unicode Plan Multilingue de Base. Depuis Python 2.2, nous avons eu ce qu'on appelle large construit et étroit construit; ces noms se réfèrent au type utilisé en interne pour stocker les points de code Unicode. L'échelle s'appuie l'utilisation de l'UCS-4, qui utilise 4 octets pour stocker un point de code Unicode. (Cela signifie UCS-4 du code de la taille de l'unité est de 4 octets, soit 32 bits.) Étroite s'appuie l'utilisation de l'UCS-2. UCS-2 n'a que 16 bits, et donc ne peut pas coder tous les points de code Unicode avec précision (c'est comme de l'UTF-16, à l'exception sans les paires de substitution). Pour le vérifier, tester la valeur desys.maxunicode
. Si c'est1114111
, vous avez un large construire (ce qui peut représenter correctement l'ensemble de l'Unicode). Si c'est moins, bien, ne vous inquiétez pas trop. Le format BMP (points de code0x0000
à0xFFFF
) couvre la plupart des besoins de la population. Pour plus d'informations, voir PEP 0261.En Python 3.x
str
est Unicode. Cela peut être soit UTF-16 ou UTF-32 selon que votre interpréteur Python a été construit avec une "étroite" ou "large" des caractères Unicode.La version Windows de Disponible utilise UTF-16. Sur les systèmes Unix, UTF-32 a tendance à être préférés.
En Python 2.x
str
est une chaîne d'octets de type Cchar
. L'encodage n'est pas définie par la langue, mais est-ce que vos paramètres régionaux par défaut de l'encodage. Ou quel que soit le MIME jeu de caractères du document vous obtenu hors de l'Internet. Ou, si vous obtenez une chaîne de caractères à partir d'une fonction commestruct.pack
, c'est des données binaires, et n'a pas véritablement avoir un encodage de caractère à tous.unicode
cordes en 2.x sont équivalentes àstr
en 3.x.Parce que Python (légèrement) est antérieure à Unicode. Et parce que Guido voulait sauver tous les grands en arrière-incompatible changements pour la 3.0. Les chaînes en 3.x ne utiliser l'Unicode par défaut.
str
objets et ignore complètementunicode
objets.unicode
est normalPython 2.x chaînes de caractères sur 8 bits, rien de plus. Le codage peut varier (même si ASCII est supposé). Je suppose que les raisons sont historiques. Quelques langues, notamment les langues qui datent du siècle dernier, l'utilisation de l'unicode immédiatement.
En Python 3, toutes les chaînes de caractères unicode.
str
n'a pas de codage, c'est juste octets qui peut être utilisé pour les données de texte de n'importe quel encodage. (D'ailleurs, si, à la fois Python 2 et 3 ont unicode et les chaînes d'octets. En Python 3, ils sontstr
etbytes
, respectivement, et en Python 2, ils sontunicode
etstr
respectivement.)Avant de Python 3.0, de codage de la chaîne a été
ascii
par défaut, mais peut être modifié. Unicode littéraux de chaîne ont étéu"..."
. C'était idiot.u
toutes vos chaînes (dont un peu posé la question de ce que furent les non-u
-ed ceux?)! =pstr
type de données représente une séquence d'octets. Ces octets ne sont pas limités à 0-127 (les valeurs d'origine de l'ASCII) ou à sémantiquement référant au texte ASCII, et ils n'étaient jamais sur ces deux points.