Преобразование из utf-16 в utf-8 в Python 3 - PullRequest
1 голос
/ 29 июня 2010

Я программирую на Python 3, и у меня возникла небольшая проблема, с которой я не могу найти ссылку на него в сети.

Насколько я понимаю, строка по умолчанию в это utf-16, но я должен работать с utf-8, я не могу найти команду, которая преобразует стандартную в utf-8.Я очень ценю вашу помощь.

1 Ответ

6 голосов
/ 29 июня 2010

В Python 3 есть два разных типа данных, важных при работе с манипуляциями со строками. Сначала есть строковый класс, объект, который представляет кодовые точки Юникода. Важно, чтобы эта строка состояла не из нескольких байтов, а из последовательности символов. Во-вторых, существует класс bytes, представляющий собой последовательность байтов, часто представляющую строку, хранящуюся в кодировке (например, utf-8 или iso-8859-15).

Что это значит для вас? Насколько я понимаю, вы хотите читать и писать файлы utf-8. Давайте создадим программу, которая заменяет все символы «ć» на символы «ç»

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)

Так, когда вы должны использовать байты? Не часто. Примером, который я мог бы придумать, было бы, когда вы читаете что-то из сокета. Если у вас есть это в байтовом объекте, вы можете сделать его строкой юникода, выполнив bytes.decode ('encoding') и наоборот с str.encode ('encoding'). Но, как уже говорилось, вероятно, вам это не понадобится.

Тем не менее, потому что это интересно, здесь трудный путь, где вы все кодируете сами:

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)

Хорошее чтение по этой теме (строковое кодирование): http://www.joelonsoftware.com/articles/Unicode.html. Очень рекомендуется прочитать!

Источник: http://docs.python.org/release/3.0.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

(PS Как вы видите, я не упомянул utf-16 в этом посте. Я на самом деле не знаю, использует ли python это как внутреннее декодирование или нет, но это совершенно не имеет значения. В данный момент вы работаете с строка, вы работаете с символами (точками кода), а не байтами.

...