我有一个包含日文字符的文件,我想知道该行是否仅包含片假名字符而不使用Qtcore
trial.txt
包含:
こにちわ
おはよう
ナルト
我希望程序说第三行是片假名字符
该文件保存为" UTF-8 Unicode文本,带有CRLF行终止符"。
如果您认为这是一个重复的问题,请评论指向相同答案问题的链接。
/*
Unicode Ranges:
3040 — 309F Hiragana
30A0 — 30FF Katakana
*/
我正在使用C ++,Visual Studio 2013,gcc 4.8.3,我当前的代码页是Unicode(带签名的UTF-8)。像u8
这样的前缀不起作用(我不知道原因,它应该有效)。
答案 0 :(得分:1)
我编辑了2个我在研究这个问题时找到的代码。
我决定采用Joachim Pileborg的建议将文件解码为UTF-32,并使用UTF-32十进制值来设置范围
//conversion from http://en.cppreference.com/w/cpp/locale/wstring_convert/converted
void utf8ToUtf32(string line){
string utf8 = line;
// the UTF-8 - UTF-32 standard conversion facet
wstring_convert<codecvt_utf8<char32_t>, char32_t> cvt;
// UTF-8 to UTF-32
u32string utf32 = cvt.from_bytes(utf8);
//printing of decimal val inspired by http://www.cs.ucr.edu/~cshelton/courses/cppsem/strex.cc
cout << utf32.length() << ": ";
for (char32_t c : utf32) {
cout << hex << c << ' ';
writeFile << c << ' ';
if (c >= 12450 && c <= 12543) cout << "k ";
}
cout << dec << endl;
writeFile << dec << endl;
}
我知道可能有其他方法可以做到这一点但是我的时间框架已经足够了。