Index: src/fe-common/core/utf8.h =================================================================== --- src/fe-common/core/utf8.h (revision 5189) +++ src/fe-common/core/utf8.h (working copy) @@ -12,5 +12,6 @@ int mk_wcwidth(unichar c); #define unichar_isprint(c) (((c) & ~0x80) >= 32) +#define is_utf8_leading(c) (((c) & 0xc0) != 0x80) #endif Index: src/fe-text/textbuffer.c =================================================================== --- src/fe-text/textbuffer.c (revision 5189) +++ src/fe-text/textbuffer.c (working copy) @@ -23,6 +23,7 @@ #include "module.h" #include "misc.h" #include "formats.h" +#include "utf8.h" #include "textbuffer.h" @@ -154,6 +155,17 @@ chunk = buffer->cur_text; while (chunk->pos + len >= TEXT_CHUNK_USABLE_SIZE) { left = TEXT_CHUNK_USABLE_SIZE - chunk->pos; + + /* don't split utf-8 character. (assume we can split non-utf8 anywhere. */ + if (left < len && !is_utf8_leading(data[left])) { + int i; + for (i = 1; i < 4 && left >= i; i++) + if (is_utf8_leading(data[left - i])) { + left -= i; + break; + } + } + if (left > 0 && data[left-1] == 0) left--; /* don't split the commands */