Разделить строку в кодировке utf-8 с учетом смещения в байтах (python 2.7) - PullRequest
1 голос
/ 16 сентября 2011

Имея строку в кодировке utf-8, например:

bar = "hello 。◕‿‿◕。"

и смещение байтов, которое говорит мне, на какой байт мне нужно разбить строку:

bytes_offset = 9  

как я могу разделить строку бара на две части, в результате чего:

>>first_part 
'hello 。' <---- #9 bytes 'hello \xef\xbd\xa1'
>>second_part 
'◕‿‿◕。'

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

Ответы [ 2 ]

3 голосов
/ 16 сентября 2011

UTF-8 Строки Python 2.x в основном являются байтовыми строками.

# -*- coding: utf-8 -*- 

bar = "hello 。◕‿‿◕。"
assert(isinstance(bar, str))

first_part = bar[:9]
second_part = bar[9:]
print first_part
print second_part

Урожайность:

hello 。
◕‿‿◕。

Python 2.6 на OSX здесь, но я ожидаю того же от 2.7. Если я разделю на 10 или 11 вместо 9, я получу? вывод символов, означающий, что он прервал последовательность байтов в середине многобайтовой последовательности символов; разделение на 12 перемещает первое «глазное яблоко» к первой части струны.

У меня установлено PYTHONIOENCODING на utf8 в терминале.

0 голосов
/ 27 февраля 2019

Смещение символа - это число символов перед смещением байта:

def byte_to_char_offset(b_string, b_offset, encoding='utf8'):
    return len(b_string[:b_offset].decode(encoding))
...