7

C++ で wchar_t 文字列を大文字から小文字に変換するにはどうすればよいですか?

文字列には、日本語、中国語、ドイツ語、ギリシャ語の文字が混在しています。

towlowerを使おうと思った...

http://msdn.microsoft.com/en-us/library/8h19t214%28VS.80%29.aspx

..しかし、ドキュメントには次のように書かれています:

towlower の大文字と小文字の変換はロケール固有です。場合によっては、現在のロケールに関連する文字のみが変更されます。

編集:私がやっていることを説明する必要があるかもしれません。ユーザーから Unicode 検索クエリを受け取りました。元はUTF-8エンコーディングですが、ワイド文字に変換しています(言葉遣いが間違っているかもしれません)。私のデバッガー(VS2008)は、「変数クイックウォッチ」で日本語、ドイツ語などの文字を正しく表示します。Unicode の別のデータ セットを調べて、検索文字列の一致を見つける必要があります。検索で大文字と小文字が区別される場合、これは問題ありませんが、大文字と小文字を区別しない場合はさらに問題になります。問題を解決するための私の(おそらく素朴な)アプローチは、すべての入力データと出力データを小文字に変換してから比較することです。

4

4 に答える 4

10

文字列にこれらすべての文字が含まれている場合、コードセットは Unicode ベースである必要があります。適切に実装されている場合、Unicode (第 4 章「文字のプロパティ」) は、文字が大文字であるか小文字のマッピングであるかなどの文字プロパティを定義します。

前置きを考えると、towlower()関数 from<wctype.h>は使用する正しいツールです。それが機能しない場合は、QoI (実装の品質) の問題があり、ベンダーと話し合う必要があります。ベンダーが応答しない場合は、代替ライブラリを検討してください。この場合、ICU (International Components for Unicode) を検討できます。

于 2009-10-23T16:50:29.190 に答える
3

あなたは厄介な問題を抱えています。日本語のロケールはドイツ語の変換には役立ちません。大文字化の概念を持たない言語もあります (toupperそして、友人はここではノーオペレーションになると思います)。では、文字列を同じ言語の単語の個々のチャンクに分割できますか? 可能であれば、ピースを変換して紐で結ぶことができます。

于 2009-10-23T16:50:01.097 に答える
1

This SO answerは、ファセットを操作して複数のロケールを操作する方法を示しています。これが Windows の場合は、win32 API 関数の使用を検討できます。C++.NET (マネージ C++) を使用できる場合は、Unicode に準拠したchar.ToLowerおよび関数を使用できます。string.ToLower

于 2009-10-23T16:53:41.053 に答える
0

( MSDN_wcslwr_l ) を参照してください。<wchar.h>

各ロケールの入力で関数を実行できるはずです。

于 2009-10-23T17:00:42.070 に答える