如果你能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如何計算字符」文章來驗證不同的方法。無論哪種情況,計算代碼點都沒有什麼意義。 –