Если вы хотите избежать прямого взлома байтов, вы можете сделать что-то вроде этого (не проверено):
gunichar c;
int len, old_len;
char buf[6];
c = g_utf8_get_char(s);
old_len = g_unichar_to_utf8(c, NULL);
c += 1;
len = g_unichar_to_utf8(c, buf);
if (len == old_len) {
memcpy(s, buf, len);
} else {
/* something more complex adjusting s length */
}
Конечно, написание этого вручную даст вам более оптимизированный код. Незначительная оптимизация, описанная выше, может использовать g_utf8_next_char (), чтобы получить следующую строковую позицию и вычислить old_len из нее, вместо того, чтобы независимо вычислять old_len.