如何在c++中检查字符的unicode值的范围

How to check range of unicode value of character in c++

本文关键字:unicode 范围 字符 检查 c++      更新时间:2023-10-16

我是C++的新手,来自非CS背景。因此,如果这个问题很愚蠢或以前已经回答过,请原谅我。

我有一个用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字符串的语言?

提前感谢您的帮助。

使用字符串,我得到的结果是

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",我认为这是正确的输出。我不确定,但那是你想要的吗。让我知道

您可以使用ICU,也可以通过查看字符串中的连续字符手动将UTF-8转换为UTF-16/32。有关UTF-8多字节字符的解释,请参阅此处。

ICU还包括unicode字符属性,这可能有助于检测脚本。

std::string没有任何内置的UTF-8到UTF-16/32转换支持,因此substr也不能返回unicode字符。

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

您可以看到这篇文章或这篇文章,了解有关此转换的更多信息。