Может искать и сказать, что работа с UTF-8 закодировала документы в Python?

Я думаю, что Вы могли использовать фактическое пространство или вкладку непосредственно в XML-документе, но если Вы ищете специальные символы для представления их так, чтобы текстовые процессоры не могли испортить их, затем это:

space =  
tab   = 	
6
задан SilentGhost 2 October 2009 в 15:19
поделиться

4 ответа

Если это правда, это звучит как ошибка или ограничение модуля кодеков, поскольку это, вероятно, сбивает с толку смещения байтов и символов.

Я бы использовал обычный open () для открытия файла, затем seek () / tell () даст вам всегда согласованные смещения байтов. Всякий раз, когда вы хотите читать, используйте f.readline (). Decode ('utf-8') .

Однако помните, что использование функции f.read () может вы окажетесь в середине многобайтового символа, что приведет к ошибке декодирования UTF-8. readline () будет работать всегда.

Это не обрабатывает метку порядка байтов для вас прозрачно, но есть вероятность, что ваши файлы журналов все равно не имеют спецификаций.

2
ответ дан 17 December 2019 в 04:48
поделиться

Для UTF-8 вам не нужно открывать файл с помощью codecs.open. Вместо этого надежно сначала прочитать файл как байтовую строку и только затем декодировать отдельный раздел (вызывая метод .decode для строки). Разрыв файла по границам строки безопасно; единственный небезопасный способ разбить его - это посередине многобайтового символа (который вы можете узнать по его байтовому значению> 128).

2
ответ дан 17 December 2019 в 04:48
поделиться

Многое из того, что происходит с UTF8 в python, имеет смысл, если вы посмотрите, как это было сделано в Python 3. В вашем случае это будет иметь немного больше смысла, если вы прочитаете Глава о файлах в Dive into Python 3: http://diveintopython3.org/files.html

Однако вкратце это file.seek и file.tell. работают с позициями байтов, тогда как символы Юникода могут занимать несколько байтов. Таким образом, если вы это сделаете:

f.seek(10)
f.read(1)
f.tell()

Вы можете легко получить что-то другое, кроме 17 , в зависимости от того, какой длины был один прочитанный символ.

1
ответ дан 17 December 2019 в 04:48
поделиться

Обновление: вы не можете искать / определять объект, возвращаемый codec.open (). Вам нужно использовать обычный файл и декодировать строки в Unicode после прочтения.

Я не знаю, почему это не работает, но я не могу заставить его работать. Например, поиск работает только один раз. Затем вам нужно закрыть и снова открыть файл, что, конечно, бесполезно.

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

Так что, вероятно, вы не можете этого сделать из-за какой-то базовой буферизации. Но декодирование после чтения работает отлично, так что сделайте это.

0
ответ дан 17 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: