検索している関数が呼び出されLCMapString
、それは Windows NLS API の一部です。LCMAP_UPPERCASE
フラグは文字を大文字にマップし、フラグは文字を小文字にマップしますLCMAP_LOWERCASE
。
Windows Vista 以降を対象とするアプリケーションの場合、識別子の代わりにロケール名で機能するEx
バリアントがあります。これは、Microsoft が現在推奨しているものです。
実際、VS 2010 (およびおそらく他のバージョンも) で提供される CRT 実装では、 などの関数は、指定された からロケール ID (LCID) を抽出した後、_towupper_l
最終的に呼び出すことになります。LCMapString
_locale_t
あなたが私のようで、i8n API にあまり慣れていない場合は、関数のCharUpper
、CharLower
、CharUpperBuff
、およびCharLowerBuff
ファミリについて既にご存知でしょう。これらは、Windows の初期の頃から、文字/文字列の大文字と小文字を変更するための古いスタンバイでしたが、ドキュメントで警告されているように:
CharXxx
現在の言語がトルコ語またはアゼリ語の場合でも、常に大文字の I を小文字の I ("i") にマップすることに注意してください。この点で言語的に敏感な関数が必要な場合は、 を呼び出しますLCMapString
。
言及されていないことは、Michael Kaplan の国際化問題に関する素晴らしいブログのいくつかの投稿で埋められています。、大文字と小文字を変更する最善の方法。エグゼクティブ サマリーは、フラグを指定せずに呼び出すことで、関数のファミリと同じ結果を達成できるということです。一方、フラグをCharXxx
指定することで、言語に注意を払うことができます。LCMapString
LCMAP_LINGUISTIC_CASING
LCMAP_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.
}