在c ++中从unicode字符串中检测语言环境

时间:2009-08-17 13:37:56

标签: c++ unicode

我有一个字符串,我想检查内容是英文还是印地文(我的本地语言)。我发现印地文字符的unicode范围来自U0900-U097F。

查找字符串是否包含此范围内的任何字符的最简单方法是什么?

我可以使用std :: string或Glib :: ustring,具体取决于哪个方便。

3 个答案:

答案 0 :(得分:2)

以下是使用Glib :: ustring执行此操作的方法:

using Glib::ustring;

ustring x("सहस");    // hindi string
bool is_hindi = false;
for (ustring::iterator i = x.begin(); i != x.end(); i ++)
    if (*i >= 0x0900 && *i <= 0x097f)
        is_hindi = true;

答案 1 :(得分:1)

第一步是编写一个仿函数来判断给定的wchar_t是否为印地语。这将(来自)std::unary_function<wchar_t, bool>。实施是微不足道的:return c>= 0x0900 && c < 0x980;。第二步是使用它:std::find_if(begin, end, is_hindi())

由于您需要Unicode,因此您应该使用wchar_t,因此std::wstringstd::stringGLib::ustring都不支持Unicode。在某些系统(特别是Windows)上,wchar_t的实现仅限于Unicode 4 = 16位,但对于99.9%的世界人口来说,这应该仍然足够。

您需要在I / O上转换为/到UTF-8,但“one character = one wchar_t”的优势很大。例如,std::wstring::substr()将合理地运作。但是,您可能仍然遇到像U + 094B(DEVANAGARI VOWEL SIGN O)这样的“字符”问题。迭代std :: wstring时,它本身就是一个字符,而不是一个修饰符。这仍然比使用UTF-8的std :: string更好,你最终会迭代U + 094B的各个字节。仅举几个原始示例,UTF8(U+094B)中的所有字节都没有为印地语保留。

答案 2 :(得分:1)

如果字符串已经编码为UTF-8,我不会将其转换为UTF-16(我假设这是MSalters所谓的“Unicode正确”)但是迭代UTF-8编码的字符串并检查是否存在印地语中的人物。

使用std :: string,您可以在UTF8-CPP库的帮助下轻松迭代: - 查看utf8 :: next()函数或迭代器类。

GLib :: ustring有iterator似乎启用相同的功能(尚未尝试过):