было высказано предположение, что этот вопрос является дубликатом 6269765. Я не использовал никаких букв b 'в исходном коде или минимальном. увидеть Внедренный редактирует ниже:str.encode() изменяет символы UTF-8
Я свел проблему я был с сегодня до этого минимального Python 3 кода:
x='\xc3\xb3'
print(''.join([hex(ord(c))[2:] for c in x]))
print(''.join([hex(c)[2:] for c in x.encode()]))
Когда я запускаю этот код я получаю:
c3b3
c383c2b3
Действительно ли str.encode() должен менять символ UTF-8 - (ЛАТИНСКОЕ МАЛОЕ ПИСЬМО O С ОСТРОМ) до двух символов ³ (ЛАТИНСКОЕ КАПИТАЛОВОЕ ПИСЬМО A CIRCUMFLEX и SUPERSCRIPT THREE)?
редактировать:
Нет ó был введен как один из комментаторов предложил. Только в некоторых случаях был введен и был прочитан из текстового файла в других. В текстовом файле была оригинальная проблема. Это был системный словарь-файл текущей версии Ubuntu. Файл датирован 23 октября 2011 года и имеет путь к файловой системе, как показано в примерах команд исходного вопроса.
Исходная проблема связана с знаком Asunción в строке 1053 этого файла. Характер ó в Асунсьоне не имеет последовательность байт C3B3, который описан в FileFormat.Info UTF-8 lookup table, как латинская буква О С ОСТРОЙ (как описано здесь для читателей, которые не могут правильно читать текст Unicode.
Нет B «» литералов были использованы в любой код, ни оригинал, ни минимальный.
Характер проблемы был обнаружен как символ UTF, который изменяется от символа ñ до Ã3.Это связано с изменением c3b3 на c383c2b3. Файл словаря буквально содержит два байта c3b3, которые дисплей - как и ожидалось, и как описано в этой таблице UTF-8. Исходная проблема была вызвана исключением из-за изменения длины.
Использование str.encode()
было использовано для решения проблемы и поиска его источника. Считается, что что-то, где-то, делало что-то похожее на str.encode()
.
Минимальный код, чтобы показать эту проблему на первый был:
x='Asunción'
print(' '.join([hex(ord(c))[2:] for c in x]))
print(' '.join([hex(c)[2:] for c in x.encode()]))
, но я обнаружил, что многие люди не смогли увидеть нижний регистр острого о поэтому я изменил его шестнадцатеричных кодов (\ х) который имел тот же шестнадцатеричный контрольный вывод как до , так и после str.encode()
в качестве первого минимального примера, приведенного выше, с буквальным полным словом Asunción
.
Тогда я решил, что было бы более минимальным использовать затронутый символ в одиночку и без пробелов в шестнадцатеричном виде.
конец редактирования, обратно к исходному сообщению:
Это UTF-8 символы встречались в файле словаря американского английском на последнем американском английском Ubuntu издания под названием /usr/share/dict/american-english
. Вы можете увидеть первое слово в этом файле с этой последовательностью с помощью следующей команды:
head -1053 /usr/share/dict/american-english|tail -1
Вы можете увидеть его в шестнадцатеричном формате с помощью команды:
head -1053 /usr/share/dict/american-english|tail -1|od -Ad -tx1
описания символов были получены из here. Я запускаю Python 3.5.2, скомпилированный на GCC 5.4.0 на Ubuntu 16.04.1 LTS, обновленный 2 дня назад.
редактировать:
правильный ответ здесь, чтобы избежать байтов полностью и не использовать str.encode()
? или есть лучший ответ?
Вы ввели символы ³, и Python отдал их вам. Что вы ожидали? –
Возможный дубликат [Что делает символ «b» перед строковым литералом?] (Http://stackoverflow.com/questions/6269765/what-does-the-b-character-do-in-front- of-a-string-literal) –
[Что нового в Python 3.0 - Текст Vs. Данные вместо Unicode Vs. 8-бит] (https://docs.python.org/3/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit) –