如何在不使用qt的情况下了解c++中的unicode块

How to know unicode block in c++ without using qt?

本文关键字:了解 情况下 c++ 中的 unicode qt      更新时间:2023-10-16

我有一个包含日语字符的文件,我想知道这行是否只包含片假名字符,而不使用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这样的前缀不起作用(我不知道为什么,它应该起作用)。

我编辑了在研究这一问题时发现的两个代码。

我决定采纳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;
}

我知道可能还有其他方法可以做到这一点,但以我现有的时间框架来看,这已经足够好了。