charset-aware测试,如isalpha()等和迭代器 - 是否有这样的事情?

时间:2010-07-27 14:47:46

标签: c++ character-encoding

我得到一个字符串和编码字符集,例如iso_8859-1utf-8等。我需要扫描字符串,将其标记为单词,就像我使用isspace()ispunc()

是否存在将字符集考虑在内的字符测试功能?另外,是否存在提升正确字节数的迭代器?

注意:
我知道我可以将字符串转换为utf8,然后使用Glib::ustring及其功能。我想知道我是否可以避免这种情况。

3 个答案:

答案 0 :(得分:1)

如果您想不惜任何代价避免转换,您必须编写一堆不同的例程:

static void handle_iso_8859_1(const char *);
static void handle_iso_8859_15(const char *);
static void handle_utf_8(const char *);

static void handle_string(const char *s, const char *encoding) {

  if (strcmp(encoding, "ISO-8859-1") == 0) {
    handle_iso_8859_1(s);
  } else if (strcmp(encoding, "ISO-8859-15") == 0) {
    handle_iso_8859_15(s);
  } else if (strcmp(encoding, "UTF-8") == 0) {
    handle_utf_8(s);
  } else {
    error("unknown encoding: %s", encoding);
  }
}

为什么你想首先避免转换?太昂贵了吗?真的太贵了吗?从ISO-8859-1转换为UTF-8非常便宜且易于操作。好吧,也许你需要一个额外的内存分配和一些字节复制。但是真的值得三次(或更多次)写相同的代码吗?

答案 1 :(得分:1)

这不回答问题的迭代部分,但是isspace,ispunct等可以识别语言环境。

如果您正在使用unicode,那么您将需要宽字符版本,iswspace,iswpunct等。

如果您不想使用全局语言环境,则存在c ++ std :: locale类的ctype方面。

答案 2 :(得分:0)

为此,您应该将文本转换为指定的编码(如utf8),然后应用处理此编码的函数。 如果你不想使用Glib :: ustring,你可以直接使用glib函数(比如g_utf8_find_next_char迭代,g_unichar_ispunct)。