1

ワイド文字列の大文字または小文字への変換を追加する必要がある既存の Visual C++ コードがいくつかあります。

これには落とし穴(トルコ語の「I」など)があることは知っていますが、言語を知っていれば、これらのほとんどを解決できます。幸いなことに、コードのこの領域では、LCID 値 (ロケール ID) を知っています。これは、言語を知っていることと同じだと思います。

LCID は Windows タイプであるため、ワイド文字列を大文字または小文字に変換する Windows 関数はありますか?

C ランタイム関数 _towupper_l() は理想的なように聞こえますが、LCID の代わりに _locale_t パラメーターを使用するため、LCID を _locale_t に変換する完全に信頼できる方法がない限り、不適切だと思います。

4

1 に答える 1

0

検索している関数が呼び出されLCMapString、それは Windows NLS API の一部です。LCMAP_UPPERCASEフラグは文字を大文字にマップし、フラグは文字を小文字にマップしますLCMAP_LOWERCASE

Windows Vista 以降を対象とするアプリケーションの場合、識別子の代わりにロケール名で機能するExバリアントがあります。これは、Microsoft が現在推奨しているものです。

実際、VS 2010 (およびおそらく他のバージョンも) で提供される CRT 実装では、 などの関数は、指定された からロケール ID (LCID) を抽出した後、_towupper_l最終的に呼び出すことになります。LCMapString_locale_t

あなたが私のようで、i8n API にあまり慣れていない場合は、関数のCharUpperCharLowerCharUpperBuff、およびCharLowerBuffファミリについて既にご存知でしょう。これらは、Windows の初期の頃から、文字/文字列の大文字と小文字を変更するための古いスタンバイでしたが、ドキュメントで警告されているように:

CharXxx現在の言語がトルコ語またはアゼリ語の場合でも、常に大文字の I を小文字の I ("i") にマップすることに注意してください。この点で言語的に敏感な関数が必要な場合は、 を呼び出しますLCMapString

言及されていないことは、Michael Kaplan の国際化問題に関する素晴らしいブログのいくつかの投稿で埋められています。大文字と小文字を変更する最善の方法。エグゼクティブ サマリーは、フラグを指定せずに呼び出すことで、関数のファミリと同じ結果を達成できるということです。一方、フラグCharXxx指定することで、言語に注意を払うことができますLCMapStringLCMAP_LINGUISTIC_CASINGLCMAP_LINGUISTIC_CASING

サンプルコード:

std::wstring test("Does my code pass the Turkey test?");
if (!LCMapStringW(lcid,            /* your LCID, defined elsewhere */
                  LCMAP_UPPERCASE | LCMAP_LINGUISTIC_CASING,
                  test.c_str(),    /* input string */
                  test.length(),   /* length of input string */
                  &test[0],        /* output buffer (can reuse input) */
                  test.length()))  /* length of output buffer (same as input) */
{
   // Uh-oh! Something went wrong in the call to LCMapString, so you need to
   // handle the error somehow here.
   // A good start is calling GetLastError to determine the error code.
}
于 2013-02-07T18:57:18.627 に答える