UTF-8 предназначен для этого.
def split_utf8(s, n):
"""Split UTF-8 s into chunks of maximum length n."""
while len(s) > n:
k = n
while (ord(s[k]) & 0xc0) == 0x80:
k -= 1
yield s[:k]
s = s[k:]
yield s
Не проверено. Но вы найдете место для разделения, а затем возвращайтесь назад, пока не доберетесь до начала персонажа.
Однако, если пользователь когда-либо захочет увидеть отдельный фрагмент, вы можете вместо этого разделить границы кластера графемы. Это значительно сложнее, но не трудно. Например, в "é"
вы могли бы не хотеть разделять "e"
и "´"
. Или вам может быть все равно, если они в конце концов снова слипнутся.