如果你能compromize,只是指望代码点,这是相当 简单直接使用UTF-8。然而,你的字典 必须是std::map<std::string, int>
。一旦你已经有了一个UTF-8的 第一个字符:
while (f.get(ch)) {
static size_t const charLen[] =
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 0, 0,
} ;
int chLen = charLen[ static_cast<unsigned char>(ch) ];
if (chLen <= 0) {
// error: impossible first character for UTF-8
}
std::string codepoint(1, ch);
-- chLen;
while (chLen != 0) {
if (!f.get(ch)) {
// error: file ends in middle of a UTF-8 code point.
} else if ((ch & 0xC0) != 0x80) {
// error: illegal following character in UTF-8
} else {
codepoint += ch;
}
}
++ dict[codepoint];
}
你会注意到,大部分的代码参与错误处理。
首先,你将需要解决一个编码。你知道你打算使用哪种编码吗?然后你需要弄清楚“角色”到底是什么意思。 –
没有'unicode character'这样的东西。您可以参考utf8everywhere.org获取unicode中不同字符概念之间的区别,或者参考“twitter如何计算字符”文章来验证不同的方法。无论哪种情况,计算代码点都没有什么意义。 –