2010-06-29 5 views
0

Je suis en train de programmer en Python 3 et j'ai un petit problème sur lequel je ne trouve aucune référence sur le net. Pour autant que je comprenne la chaîne par défaut dans utf-16, mais je dois travailler avec utf-8, je ne trouve pas la commande qui convertira de la valeur par défaut à utf-8. J'apprécierais beaucoup votre aide.Conversion de utf-16 en utf-8 en Python 3

Répondre

6

En Python 3, deux types de données différents sont importants lorsque vous manipulez des chaînes de caractères. Il y a d'abord la classe de chaînes, un objet qui représente les points de code Unicode. Il est important d'obtenir que cette chaîne ne soit pas composée de quelques octets, mais réellement d'une séquence de caractères. Deuxièmement, il y a la classe bytes, qui est juste une séquence d'octets, représentant souvent une chaîne stockée dans un encodage (comme utf-8 ou iso-8859-15).

Qu'est-ce que cela signifie pour vous? Autant que je sache, vous voulez lire et écrire des fichiers utf-8. Faisons un programme qui remplace tous les « æ » par «Ç'a personnages

def main(): 
    # Let's first open an output file. See how we give an encoding to let python know, that when we print something to the file, it should be encoded as utf-8 
    with open('output_file', 'w', encoding='utf-8') as out_file: 
     # read every line. We give open() the encoding so it will return a Unicode string. 
     for line in open('input_file', encoding='utf-8'): 
      #Replace the characters we want. When you define a string in python it also is automatically a unicode string. No worries about encoding there. Because we opened the file with the utf-8 encoding, the print statement will encode the whole string to utf-8. 
      print(line.replace('ć', 'ç'), out_file) 

Quand devriez-vous utiliser des octets? Pas souvent. Un exemple que je pourrais penser serait quand vous lisez quelque chose d'une prise. Si vous avez ceci dans un objet bytes, vous pouvez en faire une chaîne unicode en faisant bytes.decode ('encoding') et vice versa avec str.encode ('encoding'). Mais comme dit, probablement vous n'en aurez pas besoin.

encore, parce qu'il est intéressant, ici à la dure, où vous encodez tout vous:

def main(): 
    # Open the file in binary mode. So we are going to write bytes to it instead of strings 
    with open('output_file', 'wb') as out_file: 
     # read every line. Again, we open it binary, so we get bytes 
     for line_bytes in open('input_file', 'rb'): 
      #Convert the bytes to a string 
      line_string = bytes.decode('utf-8') 
      #Replace the characters we want. 
      line_string = line_string.replace('ć', 'ç') 
      #Make a bytes to print 
      out_bytes = line_string.encode('utf-8') 
      #Print the bytes 
      print(out_bytes, out_file) 

Bonne lecture sur ce sujet (encodages frets) est http://www.joelonsoftware.com/articles/Unicode.html. Vraiment recommandé lire!

Source: http://docs.python.org/release/3.0.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

(PS Comme vous le voyez, je ne l'ai pas mentionné utf-16 dans ce post, je ne sais pas vraiment si python utilise comme décodage interne ou non, mais il est totalement hors de propos. Au moment où vous travaillez avec une chaîne de caractères, vous travaillez avec des caractères (points de code), et non avec des octets

+0

Python utilise UTF-16 comme codage interne sous Windows.Sur Linux, il utilise UTF-32 – dan04

+0

hi , merci pour vos réponses Dan04 savez-vous comment puis-je lui dire d'utiliser seulement utf-8? – idan

+0

@idan Pourquoi voudriez-vous cela? En tout cas, il est pas possible sauf quand vous modifiez et recompilez Python vous-même ... –