【问题标题】:How to check range of unicode value of character in c++如何在c ++中检查字符的unicode值范围
【发布时间】:2013-12-04 22:27:22
【问题描述】:

我是 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 字符串的语言?

提前感谢您的帮助。

【问题讨论】:

  • 看来你需要了解一下文本编码。这是一篇关于该主题的不错的文章:joelonsoftware.com/articles/Unicode.html 理解这篇文章将使您so更容易处理您面临的问题。我推荐它:)
  • 感谢您的信息和及时回复。我会仔细阅读这篇文章。

标签: c++ unicode


【解决方案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,这正是我想要的!
【解决方案2】:

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

ICU 还包括 unicode 字符属性,这可能会有所帮助,例如用于检测脚本。

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

【讨论】:

  • 我同意你的看法。我不是很热衷于使用外部库,很抱歉应该提到这一点。并且不需要任何这些特殊属性和超出字符的十六进制值的国际化。
  • 正如@Neet 提到的,ICU 还具有“示例字符”(泰卢固语实际使用的字符)、UnicodeSet(用于执行字符范围内的操作)以及字符道具。这些为您提供了很多用于“检测字符串可能是什么语言”的工具,但缺少全面的语言分析。 ICU 的编写是为了让这些操作以一致的跨平台方式可用。有人可能会说“不是外部库!”或“它太大了!”但是,要做到这一点需要付出努力……
【解决方案3】:

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

您可以查看this postthis one 了解有关此转换的更多信息。

【讨论】:

    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多