我得到一个字符串和编码字符集,例如iso_8859-1
,utf-8
等。我需要扫描字符串,将其标记为单词,就像我使用isspace()
和ispunc()
。
是否存在将字符集考虑在内的字符测试功能?另外,是否存在提升正确字节数的迭代器?
注意:
我知道我可以将字符串转换为utf8,然后使用Glib::ustring
及其功能。我想知道我是否可以避免这种情况。
答案 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)。