Retourner les N premiers caractères d'une chaîne unicode
J'ai une chaîne de caractères au format unicode et j'ai besoin de renvoyer les N premiers caractères.
Je suis en train de faire ceci:
result = unistring[:5]
mais bien sûr, la longueur des chaînes unicode != longueur de caractères.
Des idées? La seule solution est d'utiliser re?
Edit: Plus d'infos
unistring = "Μεταλλικα" #Metallica written in Greek letters
result = unistring[:1]
retourne-> ?
Je pense que des chaînes unicode sont deux octets (char), c'est pourquoi cette chose arrive. Si je fais:
result = unistring[:2]
- Je obtenir
M
ce qui est correct,
Donc, dois-je toujours tranches*2 ou devrais-je convertir à quelque chose?
Êtes-vous sûr que vous avez une chaîne unicode réelle, et non pas (dire) un bytestring avec des données UTF-8? Si oui, comment définir le "caractère"? (unicode chaînes sont des chaînes de codepoints (UCS-4 builds) ou codeunits.)
De notre hôte: le joelonsoftware.com/articles/Unicode.html
Allons, s'il vous plaît pas. Ce n'est pas vraiment applicable ici.
En fait, il est. L'OP est clairement confus au sujet de l'unicode rapport à UTF-8.
De notre hôte: le joelonsoftware.com/articles/Unicode.html
Allons, s'il vous plaît pas. Ce n'est pas vraiment applicable ici.
En fait, il est. L'OP est clairement confus au sujet de l'unicode rapport à UTF-8.
OriginalL'auteur Jon Romero | 2010-01-28
Vous devez vous connecter pour publier un commentaire.
Malheureusement, pour des raisons historiques, avant de Python 3.0 il y a deux types de chaînes. chaînes d'octets (
str
) et des chaînes Unicode (unicode
).Avant l'unification en Python 3.0 il y a deux façons de déclarer une chaîne de caractères littérale:
unistring = "Μεταλλικα"
qui est une chaîne d'octets etunistring = u"Μεταλλικα"
qui est une chaîne unicode.La raison pour laquelle vous voir
?
lorsque vous neresult = unistring[:1]
est parce que certains des caractères de votre texte Unicode ne peuvent pas être correctement représentée dans la chaîne non-unicode. Vous avez probablement vu ce genre de problème si vous avez déjà utilisé un très ancien client de messagerie et de réception des e-mails de vos amis dans des pays comme la Grèce par exemple.Donc en Python 2.x si vous avez besoin pour gérer Unicode, vous devez le faire explicitement. Jetez un oeil à cette introduction à traiter avec Unicode Python: Unicode HOWTO
Vous êtes en droit de Marque, il est plus correct de se référer à eux comme les chaînes d'octets plutôt que des chaînes ASCII, j'ai mis à jour la réponse en conséquence. Ce que j'essaye vraiment de le express a été que de texte ASCII (ou l'équivalent chaîne d'octets selon le code des pages sur votre ordinateur), est la seule chose qui peuvent être manipulés en toute sécurité avec des chaînes d'octets.
L'Unicode HOWTO lien est mort
OriginalL'auteur Tendayi Mawushe
Quand vous dites:
Vous n'ont pas une chaîne unicode. Vous avez un bytestring (probablement) en UTF-8. Ce n'est pas la même chose. Une chaîne unicode est séparé de type de données en Python. Vous obtenez unicode par le décodage bytestrings à l'aide de la droite d'encodage:
ou par l'utilisation de l'unicode littérale dans un fichier source avec le bouton droit de la déclaration de codage
La chaîne unicode à faire ce que vous voulez, quand vous ne
unistring[:5]
.-1 Ce n'est pas correct u"Certains Unicode test"[:5] Peut donner illégal de la séquence, parce que UTF-16 est de largeur variable de codage, de sorte que la coupe "Unicode" chaîne n'est pas correct que la coupe de chaîne utf-8
Vous semblez confondre entre UTF-16 et Unicode. Python utilise uniquement UTF-16 pour Unicode UCS-2 versions (qui est principalement sur Windows). Dans l'UCS-4 s'est construit, de tranchage unicode fonctionne très bien (ce qui est pourquoi vous devriez l'utiliser UCS-4 s'est construit.). En UCS-2 construit, il fonctionne très bien pour tout BMP caractère, qui est ce que l'OP a été à l'aide.
Par défaut de Python construire avec UCS-2, même sur linux. Je sais qu'il est possible d'utiliser de l'UCS-4 s'est construit, mais ils ne sont pas communs. Donc, en tout cas, en supposant que la chaîne peut être coupé "en" est erroné. Sauf si vous travaillez dans BMP. En tout cas c'est une mauvaise approche. Voir ma réponse ci-dessous pour la raison.
La valeur par défaut est UCS-2, mais la plupart des distributions linux en fait, l'utilisation de l'UCS-4. Il suffit de prendre un coup d'oeil à sys.maxunicode sur un système classique. Lors de l'utilisation d'un UCS-2 construire et non-BMP personnages, il n'y a pas de bonne façon de tranche, peu importe.
OriginalL'auteur Thomas Wouters
Il n'y a pas de bonne straight-forward approche avec n'importe quel type de "chaîne Unicode".
Même Python Unicode UTF-16 chaîne de longueur variable des personnages, vous ne pouvez pas le couper avec ustring[:5]. Parce que certains points de Code Unicode peut utiliser plus d'un "caractère", c'est à dire les paires de Substitution.
Donc, si vous voulez couper 5 points de code (remarque ce ne sont pas des caractères) de sorte que vous pouvez analyser le texte, voir http://en.wikipedia.org/wiki/UTF-8 et http://en.wikipedia.org/wiki/UTF-16 définitions. Si vous devez utiliser des masques de bits de comprendre les limites.
Aussi vous n'avez toujours pas de caractères. Parce que par exemple. Le mot "שָלוֹם" - la paix en hébreu "Shalom" est composée de 4 personnages et de 6 points de code à la lettre "shin", la voyelle "a" lettre "lamed", la lettre "vav" et la voyelle "o" et la version finale de la lettre "mem".
Donc caractère n'est pas point de code.
Même pour la plupart des langues occidentales où une lettre avec des signes diacritiques peuvent être représentées par deux points de code. De recherche, par exemple pour la "normalisation unicode".
... Donc Si vous avez vraiment besoin d'5 premiers caractères que vous avez à utiliser des outils comme les soins intensifs de la bibliothèque. Par exemple, il est ICU bibliothèque Python qui fournit des caractères limite itérateur.
OriginalL'auteur Artyom