2009-08-17 12 views
6

文字列があり、内容が英語かヒンディー語(私の現地語)であるかどうかチェックしたい。ヒンディー文字のユニコード範囲はU0900-U097Fからのものだとわかりました。ユニコード文字列のロケールをC++で検出する

文字列にこの範囲の文字が含まれているかどうかを調べる最も簡単な方法は何ですか?

便利な方法でstd :: stringまたはGlib :: ustringを使用できます。

+0

は何ですか使用しているエンコーディングは? – AraK

+0

私はUTF-8を使用しています。 – Pallavi

答えて

2

あなたは口が達者でそれを行う方法です::を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; 
+0

"सहस"ビットは移植性がなく、理論上も実践的にも移植性がありません。ヒンディー語をサポートする 'char'エンコーディングがあれば動作します。ヒンディー語はU0900-U097Fなので、これをASCIIに追加して8ビットに収めることができるので、このようなエンコーディングが存在すると仮定します。 – MSalters

1

最初のステップは、指定されたwchar_tがヒンディー語であるかどうかを判断するためのファンクタを作成することです。これはstd::unary_function<wchar_t, bool>から派生したものです。実装は簡単です:return c>= 0x0900 && c < 0x980;。 2番目のステップは、それを使用しています:std::find_if(begin, end, is_hindi())

ユニコードが必要なので、おそらくwchar_t、したがってstd::wstringを使用する必要があります。 std::stringでもGLib::ustringも、Unicodeを適切にサポートしていません。いくつかのシステム(特にWindows)では、wchar_tの実装はUnicode 4 = 16ビットに制限されていますが、それでも世界人口の99.9%で十分です。

I/Oで/からUTF-8に変換する必要がありますが、「1文字= 1つのwchar_t」の利点は大きいです。たとえば、std::wstring::substr()は合理的に動作します。 U + 094B(DEVANAGARI VOWEL SIGN O)のような "文字"にはまだ問題があるかもしれません。 std :: wstringを反復処理すると、修飾子の代わりに文字として表示されます。これは、UTF-8のstd :: stringよりも優れています。ここで、U + 094Bの個々のバイトを反復処理します。オリジナルの例だけを取ると、UTF8(U+094B)のバイトはヒンディー語用に予約されていません。

+0

答えをありがとう。ファンクタ内の比較文はどのように見えますか? – Pallavi

+0

なぜGLib :: ustringはUnicodeを正しくサポートしていないのですか? –

+0

@ltcmelo、彼は「正しく」書きませんでした。彼は「正しい」と書きました。つまり、Unicodeをサポートするためにstd :: stringなどを使用できますが、std :: string自体はUnicodeについて何も知らないということです。 –

1

文字列がすでにUTF-8としてエンコードされている場合は、UTF-16に変換しません(MSaltersが「Unicode」と呼んでいると仮定します)。UTF-8でエンコードされた文字列を繰り返し、その中のヒンディー語の文字。

std :: stringを使用すると、UTF8-CPPライブラリの助けを借りて簡単に反復することができます: - utf8 :: next()関数またはiteratorクラスを見てください。

はGLib :: UStringではiteratorを持って同じ機能(それを試していない)を有効にするようだ:ここで

関連する問題