如何在C++中检查字符的Unicode值范围?

5

我是一名非计算机科学专业出身的新手,对C++语言不是很熟悉。如果我的问题比较幼稚或者已经被回答过,请多多包涵。

我在C++中有一个字符串,它使用泰卢固语。

std::string str = "ఉంది"; // (it means exists; pronounced as Vundi)
std::string substring = str.substr(0,3);

上述子字符串应为“ఉ”(发音为Vu),其Unicode十六进制值为0C09。
如何从子字符串获取值0C09? 目的是检查子字符串是否在泰卢固语的有效范围内(0C00-0C7F)。
我已经看到其他问题,它们适用于obj-c、java、php、c#等。我特别寻找使用std::string的c++。
根据评论,我阅读了joelonsoftware.com/articles/Unicode.html上的文章。
让我用更多信息更新我的问题。 我正在使用Fedora 19 x86_64,并且编码为UTF-8。控制台能够正确显示文本。
根据文章,如果我理解正确,ASCII是单字节字符,unicode是多字节字符。上面的代码示例反映了这一点,在这里每个Unicode字符的长度为3个字节。除了谈论UTF-8/文本编码和多字节字符之外,该文章在检测Unicode字符串的语言方面没有提供实际帮助。
也许我应该重新表达我的问题:
如何在C++中检测Unicode字符串的语言?
提前感谢您的帮助。

2
看起来您需要学习有关文本编码的知识。这是一篇不错的文章:http://www.joelonsoftware.com/articles/Unicode.html 了解这篇文章将使您更容易处理面临的问题。我建议阅读它 :) - Magnus Hoff
感谢您提供的信息和迅速的回复。我会仔细阅读这篇文章。 - user3014442
3个回答

1
使用字符串得到的结果是:
std::string str = "ఉంది"; // (it means exists; pronounced as Vundi)
unsigned short i =str[0];
printf("%x %d",i,i);

输出结果为"ffeo 65504"
但是当我使用wstring时,即:
std::wstring str = L"ఉంది"; // (it means exists; pronounced as Vundi)
unsigned short i =str[0];
printf("%x %d",i,i);

输出结果为"c09 3081",我认为这是正确的输出。我不确定这是否符合您的要求,请告诉我。

谢谢Kunal,这正是我在寻找的! - user3014442

0
您可以使用 ICU 或手动将 UTF-8 转换为 UTF-16/32,通过查看字符串中连续的字符。请参阅 这里,了解有关 UTF-8 多字节字符的说明。
ICU 还包括 Unicode 字符属性,这可能有助于检测脚本。 std::string 没有任何内置支持,用于从 UTF-8 转换为 UTF-16/32,因此 substr 也无法返回 Unicode 字符。

我同意你的观点。我并不是很热衷于使用外部库,抱歉没有提到这一点。除了字符的十六进制值之外,我也不需要任何特殊属性和国际化。 - user3014442
正如@Neet所提到的,ICU还具有“示例字符”(实际上由泰卢固语使用的字符),UnicodeSet(用于执行范围内的字符操作)以及字符属性。这些为您提供了许多工具,可以“检测字符串可能是哪种语言”,而无需进行全面的语言分析。ICU是这样编写的,以便以一致的跨平台方式提供这些操作。有人可能会说“不是外部库!”或“它太大了!”,但是,要做到这一点需要付出努力... - Steven R. Loomis

0

你需要将编码(很可能是utf8)(char *)转换为宽字符(wchar_t)。

你可以查看这篇文章这篇文章以获取有关此转换的更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接