将UTF-8字符推进到下一个字符

时间:2011-02-05 04:55:15

标签: c string encoding utf-8 glib

我想更改UTF-8字符(位于gchar数组中),因此它根据标准获取下一个字符的值。我正在使用glib,我没有看到这样的功能。我正在考虑一个可能的解决方案,但它可能需要更多的努力,当然它不会是最有效的,因为我不太了解编码。有没有可以做到这一点的图书馆?谷歌搜索没有帮助。

2 个答案:

答案 0 :(得分:6)

这实际上只是添加 - 携带模64.将字符的字节视为“数字”。您递增最后一个字节,如果它溢出,则将其重置为可能的最小值,并递增倒数第二个字节。

例如,一个简单的增量:

e0 b0 be -> e0 b0 bf

单次携带的增量:

e0 b0 bf -> e0 b1 80

带双进位的增量:

e0 bf bf -> e1 80 80

当你增加超过给定大小的最后一个字符时,你需要转到下一个大小的第一个字符,这当然不能在字符串的中间就地完成。

答案 1 :(得分:2)

如果你想避免直接的字节黑客攻击,你可以做这样的事情(未经测试):

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。