2012-01-10 25 views
1

ワイド文字列を大文字または小文字に変換する必要がある既存のVisual C++コードがあります。LCID(Visual C++)を指定したワイド文字の変換ケース

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

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

Cランタイム関数_towupper_l()は理想的ですが、LCIDの代わりに_locale_tパラメータをとります。したがって、LCIDを_locale_tに変換する完全な信頼性の高い方法がない限り、不適切です。

+0

? –

+0

いいえ申し訳ありません私は元の投稿にそのことについてのコメントを追加するのを忘れていました。 towupper()のドキュメントでは、 "towupperの大文字と小文字の変換はロケール固有です。現在のロケールに関連する文字だけが変更されます。_l接尾辞が付いていない関数は、現在設定されているロケールを使用します。 _l suffixはロケールをパラメータとして使用し、現在設定されているロケールの代わりに使用します。 "LCIDは現在のロケールではない可能性があるので、そのロケールを使用して信頼できる結果を得るには、_lバージョンを使用して該当する_locale_tを渡す必要があります。 – appleton

答えて

0

あなたが探している機能は、LCMapStringと呼ばれ、Windows NLS APIの一部です。 LCMAP_UPPERCASEフラグは文字を大文字にマップし、LCMAP_LOWERCASEは文字を小文字にマップします。

Windows Vista以降を対象とするアプリケーションでは、識別子の代わりにロケール名で動作するan Ex variantがあります。これは、Microsoftが使いたいと言っているものです。 (そしておそらく他のバージョンも同様)VS 2010を備えたCRT実装で実際に

、例えば_towupper_lなどの機能は、最終的にそれらが指定_locale_tからロケールID(LCID)を抽出した後LCMapStringを呼び出してしまいます。

あなたが私に似ている、とあなたが必要以上i8n APIとあまり馴染みの場合、あなたはおそらくすでにCharUpperCharLowerCharUpperBuff、および機能のCharLowerBuff家族について知っています。これらは、文字/文字列のケースを変更するためのWindowsの初期の頃からの古いスタンバイしているが、そのドキュメントは警告しているよう:CharXxxはいつも私も、I(「I」)小文字に大文字にマッピングすることを

注意を現在の言語がトルコ語またはアゼリ語の場合。この点で言語的に敏感な機能が必要な場合は、LCMapStringに電話してください。

何それは言及する無視することは国際問題に関するマイケル・カプランの素晴らしいブログの投稿のカップルによって満たされる:What does "linguistic casing" mean?How best to alter case。エグゼクティブ・サマリーは、あなたがLCMAP_LINGUISTIC_CASINGフラグを指定を行うことを確実にすることによって、言語的に敏感であることができ、一方、LCMAP_LINGUISTIC_CASINGフラグを指定しないLCMapStringを呼び出すことにより、機能のCharXxx家族と同じ結果を得ることです。

サンプルコード:あなたは `towupper`または` towlower`を使用することはできません

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. 
}