Mam ciąg zawierający tekst zakodowany w utf-8. Muszę usunąć ostatnią literę utf-8.
Jak dotąd zrobiłem
msg = msg[:-1]
ale to tylko usuwa ostatni bajt. Działa tak długo, jak ostatni znak jest kodem ASCII. Nie działa już, gdy ostatni znak jest znakiem wielobajtowym.
Odpowiedzi:
4 dla odpowiedzi № 1The najprostszy sposobem jest dekodowanie twoich bajtów utf-8 na tekst Unicode:
without_last = msg.decode("utf8")[:-1]
Zawsze możesz go ponownie zakodować.
Alternatywą byłoby, abyś szukał a utf-8 start bajt; sekwencje bajtów utf-8 zawsze zaczynają się od bajtu z najbardziej znaczącym bitem ustawionym na 0
lub dwa najbardziej znaczące bity ustawione na 1
, podczas gdy bajty kontynuacji zawsze zaczynają się od 10
:
# find starting byte of last codepoint
pos = len(msg) - 1
while pos > -1 and ord(msg[pos]) & 0xC0 == 0x80:
# character at pos is a continuation byte (bit 7 set, bit 6 not)
pos -= 1
msg = msg[:pos]