Вам необходимо использовать свойства from
и exact
. Чтобы использовать оба свойства, такой Redirect
должен быть дочерним по отношению к компоненту Switch
(см. Документы здесь ):
(
)}>
В нотации
u'Capit\xe1n\n'
"\xe1" представляет всего один байт. "\x" говорит Вам, что "e1" находится в шестнадцатеричном. Когда Вы пишете
Capit\xc3\xa1n
в Ваш файл, у Вас есть "\xc3" в нем. Это - 4 байта, и в Вашем коде Вы читаете их всех. Вы видите это при отображении их:
>>> open('f2').read()
'Capit\\xc3\\xa1n\n'
Вы видите, что обратной косой черты оставляет обратная косая черта. Таким образом, у Вас есть четыре байта в Вашей строке: "\", "x", "c" и "3".
Редактирование:
, Поскольку другие указали в их ответах, необходимо просто ввести символы в редактора, и редактор должен затем обработать преобразование в UTF-8 и сохранить его.
, Если у Вас на самом деле есть строка в этом формате, можно использовать string_escape
кодек для декодирования его в нормальную строку:
In [15]: print 'Capit\\xc3\\xa1n\n'.decode('string_escape')
Capitán
результатом является строка, которая кодируется в UTF-8, где символ с диакритикой представлен на два байта, которые были записаны \\xc3\\xa1
в исходной строке. Если Вы хотите иметь строку unicode, необходимо декодировать снова с UTF-8.
К Вашему редактированию: у Вас нет UTF-8 в Вашем файле. Чтобы на самом деле видеть, как это было бы похоже:
s = u'Capit\xe1n\n'
sutf8 = s.encode('UTF-8')
open('utf-8.out', 'w').write(sutf8)
Сравнивают содержание файла utf-8.out
к содержанию файла, который Вы сохранили со своим редактором.
\x.. последовательность - что-то, что это характерно для Python. Это не универсальная escape-последовательность байта.
то, Как Вы на самом деле входите в UTF-8-encoded неASCII, зависит от Вашей ОС и/или Вашего редактора. Вот то, как Вы делаете это в Windows . Чтобы OS X вошел с акутом, можно просто поразить опцию + E , затем , и почти все текстовые редакторы в OS X поддерживают UTF-8.
Ну, Ваш любимый текстовый редактор не понимает, что \xc3\xa1
, как предполагается, символьные литералы, но он интерпретирует их как текст. Вот почему Вы получаете двойные обратные косые черты в последней строке - это - теперь реальная обратная косая черта + xc3
, и т.д. в Вашем файле.
, Если Вы хотите считать и записать закодированные файлы в Python, лучше всего используйте эти кодеки модуль.
текст Вставки между терминалом и приложениями является трудным, потому что Вы не знаете, какая программа интерпретирует Ваше текстовое использование который кодирование. Вы могли попробовать следующее:
>>> s = file("f1").read()
>>> print unicode(s, "Latin-1")
Capitán
Затем вставка эта строка в Вашего редактора и удостоверяется, что хранит его с помощью латинского 1. Под предположением, что буфер обмена не искажает строку, должно работать распространение в прямом и обратном направлениях.
Так, я нашел решение для того, что я ищу, который является:
print open('f2').read().decode('string-escape').decode("utf-8")
существуют некоторые необычные кодеки, которые полезны здесь. Это конкретное чтение позволяет взять представления UTF-8 из Python, скопировать их в ASCII-файл и сделать, чтобы они были считаны в в Unicode. При "строковом Escape" декодируют, наклонные черты не будут удвоены.
Это допускает вид распространения в прямом и обратном направлениях, которое я воображал.
Вы споткнулись общую проблему с кодировкой: Как я могу сказать, в котором кодирование файла?
Ответ: Вы не можете , если формат файла не предусматривает это. XML, например, начинается:
<?xml encoding="utf-8"?>
Этот заголовок был тщательно выбран так, чтобы он мог быть считан, неважно, кодирование. В Вашем случае нет такой подсказки, следовательно ни у Вашего редактора, ни Python нет идеи, что продолжается. Поэтому необходимо использовать codecs
модуль и использование codecs.open(path,mode,encoding)
, который обеспечивает недостающий бит в Python.
Что касается Вашего редактора, необходимо проверить, предлагает ли это некоторый способ установить кодирование файла.
точка UTF-8 должна смочь закодировать 21-разрядные символы (Unicode) 8-разрядным потоком данных (потому что это - единственная вещь, которую все компьютеры в мире могут обработать). Но начиная с большей части OSs предшествуют эре Unicode, у них нет подходящих инструментов для присоединения информации о кодировании к файлам на жестком диске.
следующий выпуск является представлением в Python. Это объяснено отлично в эти комментарий heikogerlach. Необходимо понять, что консоль может только отобразить ASCII. Для отображения Unicode или чего-либо> = charcode 128, он должен использовать некоторые средства выхода. В Вашем редакторе Вы не должны вводить завершенную строку дисплея, но что означает строка (в этом случае, необходимо ввести умляут и сохранить файл).
Тем не менее можно использовать оценку функции Python () для превращения завершенной строки в строку:
>>> x = eval("'Capit\\xc3\\xa1n\\n'")
>>> x
'Capit\xc3\xa1n\n'
>>> x[5]
'\xc3'
>>> len(x[5])
1
, Как Вы видите, строка "\xc3" была превращена в отдельный символ. Это - теперь 8-разрядная строка, закодированный UTF-8. Получить Unicode:
>>> x.decode('utf-8')
u'Capit\xe1n\n'
Gregg Lind спросил: Я думаю, что существуют некоторые части, отсутствующие здесь: файл f2 содержит: шестнадцатеричное число:
0000000: 4361 7069 745c 7863 335c 7861 316e Capit\xc3\xa1n
codecs.open('f2','rb', 'utf-8')
, например, читает их всех в, отдельные (ожидаемые) символы Являются там каким-либо способом записать в файл в ASCII, который работал бы?
Ответ: Это зависит от того, что Вы имеете в виду. ASCII не может представить символы> 127. Таким образом, Вам нужен некоторый способ сказать, что "следующие несколько символов означают что-то специальное", которое является тем, что делает последовательность "\x". Это говорит: следующие два символа являются кодом отдельного символа. "\u" делает то же использование четырех символов для кодирования Unicode до 0xFFFF (65535).
, Таким образом, Вы не можете непосредственно записать Unicode в ASCII (потому что ASCII просто не содержит те же символы). Можно записать это, поскольку строка выходит (как в f2); в этом случае файл может быть представлен как ASCII. Или можно записать это как UTF-8, в этом случае, Вам нужен 8-разрядный безопасный поток.
Ваше решение с помощью decode('string-escape')
действительно работает, но необходимо знать, сколько памяти Вы используете: Три раза объем использования codecs.open()
.
Помнят, что файл является просто последовательностью байтов с 8 битами. Ни биты, ни байты не имеют значение. Это - Вы, кто говорит "65, означает 'A'". С тех пор \xc3\xa1
должен стать "Г", но компьютер не имеет никаких средств знать, необходимо сказать его путем определения кодирования, которое использовалось при записи файла.
Вместо того, чтобы возиться с методами кодирования и декодирования Мне проще указать кодировку при открытии файла. Модуль io
(добавлен в Python 2.6) предоставляет функцию io.open
, которая имеет параметр кодирования.
Используйте метод open из io Модуль
.
>>>import io
>>>f = io.open("test", mode="r", encoding="utf-8")
Затем после вызова функции read () функции f, возвращается закодированный объект Unicode.
>>>f.read()
u'Capit\xe1l\n\n'
Обратите внимание, что в Python 3 функция io.open
является псевдонимом для встроенной функции open
. Встроенная функция open поддерживает аргумент кодировки только в Python 3, но не в Python 2.
Изменить: ранее в этом ответе рекомендовался модуль кодеков . Модуль кодеков может вызвать проблемы при смешивании read ()
и readline ()
, поэтому в этом ответе вместо этого рекомендуется модуль io .
Используйте метод open из модуля кодеков.
>>>import codecs
>>>f = codecs.open("test", "r", "utf-8")
Затем после вызова функции f read () возвращается закодированный объект Unicode.
>>>f.read()
u'Capit\xe1l\n\n'
Если вы знаете кодировку файла, использование пакета кодеков будет намного меньше сбивает с толку.