文字列があり、内容が英語かヒンディー語(私の現地語)であるかどうかチェックしたい。ヒンディー文字のユニコード範囲はU0900-U097Fからのものだとわかりました。ユニコード文字列のロケールをC++で検出する
文字列にこの範囲の文字が含まれているかどうかを調べる最も簡単な方法は何ですか?
便利な方法でstd :: stringまたはGlib :: ustringを使用できます。
文字列があり、内容が英語かヒンディー語(私の現地語)であるかどうかチェックしたい。ヒンディー文字のユニコード範囲はU0900-U097Fからのものだとわかりました。ユニコード文字列のロケールをC++で検出する
文字列にこの範囲の文字が含まれているかどうかを調べる最も簡単な方法は何ですか?
便利な方法でstd :: stringまたはGlib :: ustringを使用できます。
あなたは口が達者でそれを行う方法です::を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;
"सहस"ビットは移植性がなく、理論上も実践的にも移植性がありません。ヒンディー語をサポートする 'char'エンコーディングがあれば動作します。ヒンディー語はU0900-U097Fなので、これをASCIIに追加して8ビットに収めることができるので、このようなエンコーディングが存在すると仮定します。 – MSalters
最初のステップは、指定された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)
のバイトはヒンディー語用に予約されていません。
答えをありがとう。ファンクタ内の比較文はどのように見えますか? – Pallavi
なぜGLib :: ustringはUnicodeを正しくサポートしていないのですか? –
@ltcmelo、彼は「正しく」書きませんでした。彼は「正しい」と書きました。つまり、Unicodeをサポートするためにstd :: stringなどを使用できますが、std :: string自体はUnicodeについて何も知らないということです。 –
は何ですか使用しているエンコーディングは? – AraK
私はUTF-8を使用しています。 – Pallavi