2013-07-01 1 views
3

Я довольно новичок в python, но так как мой родной язык включает в себя некоторые неприятные умляуты, я должен погрузиться в кошмар, чтобы кодирование было в самом начале. Я прочитал текст joelonsoftware по кодированию и понял разницу между кодовыми точками и фактическими визуализацией букв (и соединение между юникодом и кодировками). Чтобы избавить меня от неприятностей, я нашел 3 способа борьбы с умлаутами, но я не могу решить, какой из них подходит для ситуаций. Если кто-то может пролить свет на него? Я хочу иметь возможность писать текст в файл, читать с него (или sqlite3) и выдавать текст, включая чтение удобочитаемых умлетов ... Спасибо большое!Какой из этих методов кодирования является самым надежным?

# -*- coding: utf-8 -*- 
import codecs 

# using just u + string 
with open("testutf8.txt", "w") as f: 
    f.write(u"Österreichs Kapitän") 

with open("testutf8.txt", "r") as f: 
    print f.read() 


# using encode/decode 
s = u'Österreichs Kapitän' 
sutf8 = s.encode('UTF-8') 
with open('encode_utf-8.txt', 'w') as f2: 
    f2.write(sutf8) 
with open('encode_utf-8.txt','r') as f2: 
    print f2.read().decode('UTF-8') 


# using codec 
with codecs.open("testcodec.txt", "w","utf-8") as f3: 
    f3.write(u"Österreichs Kapitän") 

with codecs.open("testcodec.txt", "r","utf-8") as f3: 
    print f3.read() 

EDIT: Я проверил это (содержимое файла 'Österreichs Kapitän'):

with codecs.open("testcodec.txt", "r","utf-8") as f3: 

    s= f3.read() 
    print s 
    s= s.replace(u"ä",u"ü") 
    print s 

Должен ли я использовать u'string»(юникод) всюду в моем коде? Я узнал, что если я просто использую пустую строку (без «u»), замена umlauts не сработала ...

ответ

4

Как правило, обычно вы хотите декодировать закодированную строку как можно раньше как возможно, затем манипулируйте им как объект unicode и, наконец, закодируйте его как можно позже (прежде чем записывать его в файл, например).

Так например .:

with codecs.open("testcodec.txt", "r","utf-8") as f3: 
    s = f3.read() 

# modify s here 

with codecs.open("testcodec.txt", "w","utf-8") as f3: 
    f3.write(s) 

Что касается вашего вопроса, какой путь является лучшим, чтобы сделать это: Я не думаю, что есть разница между использованием библиотеки кодеков или с помощью кодирования/декодирования вручную. Это вопрос предпочтения, либо работает.

Просто используя open, как в вашем первом примере, не работает, так как python попытается кодировать строку с использованием кодека по умолчанию (который является ASCII, если вы его не изменили).

Что касается вопроса о том, следует ли использовать строки Unicode везде: В принципе, да. Если вы создаете строку s = 'asdf', она имеет тип str (вы можете проверить это с помощью type(s)), а если вы делаете s2 = u'asdf', то она имеет тип unicode. И так как лучше всегда манипулировать объектами юникода, рекомендуется последнее.

Если вы не хотите, чтобы всегда иметь приобщить «и» в начале строки, вы можете использовать следующий импорт:

from __future__ import unicode_literals 

Тогда вы можете сделать s = 'asdf' и s будет иметь тип unicode. В Python3 это значение по умолчанию, поэтому импорт нужен только в Python2.

Для получения потенциальных ошибок вы можете взглянуть на Any gotchas using unicode_literals in Python 2.6?. В принципе, вы не хотите смешивать строки, закодированные utf-8, и строки Unicode.

+0

Спасибо большое, это дало мне некоторое представление ... не опубликовал ли код в комментариях? – Mike

+0

Вы можете нажать кнопку «help» рядом с полем комментария, чтобы узнать о принятом синтаксисе (они называют его мини-Markdown). Код в комментариях должен быть окружен обратными окнами ('). – rkrzr

+0

Спасибо. Должен ли я писать 'u" österreich ", чтобы иметь возможность работать, например. заменить буквы? Пожалуйста, см. Мой отредактированный вопрос для всего примера ... – Mike