2009-05-26 32 views
7

VB6アプリケーションの文字列出力のエンコーディングを特定のエンコーディングに変換する必要があります。Windowsの現在のデフォルトのコードページをプログラムで確認するにはどうすればよいですか?

VB6のドキュメントによると、特定のAPI機能にアクセスする際に内部のUnicode文字列を使用して、ANSI文字列に変換されます。

問題は、私はそのため、文字列のエンコーディングを知らない、ありますWindowsのデフォルトコードページ。そのための

、文字列出力のエンコーディングが異なるシステムに異なる場合がありますが、私は、変換を実行するためにそれを知っている必要があります。

Win32 APIを使用してデフォルトのコードページを読み取るにはどうしたらいいですか?それ以外の方法がない場合は、レジストリを読んでください。

答えて

14

GetACP - 既定のコードページを返すためのWin32 API呼び出しを使用すると、さらに簡潔になる可能性があります。

int nCodePage = GetACP(); 

また、多くのAPI呼び出し(などMultiByteToWideCharなど)一定の値CP_ACP(ゼロ)を受け入れ、常にmeans "use the system code page"(デフォルトのコードページはしばしば "ANSI" と呼ばれています)。したがって、実際にコードページを知る必要はないかもしれません。私の答えのように

+0

からの識別子コード「ANSI」と言及するように編集者に提案し、コードの書式を少し改善してくれたおかげです。良いアイデア、私はそれに応じてそれを編集しました。 – MarkJ

+1

このANSIの使用法は全く無意味です。 Windowsコードページは、標準となることが意図されているため、ANSIコードページと呼ばれることがよくあります。彼らは決してしなかった。 ANSIを使ってデフォルトを参照するのは非常に混乱しています。 – MicroVirus

1

GetSystemDefaultLCID()は、システムロケールを提供します。

LCIDが十分でないと、あなたが本当にコードページが必要な場合は、このコードを使用します。

TCHAR szCodePage[10]; 
    int cch= GetLocaleInfo(
    GetSystemDefaultLCID(), // or any LCID you may be interested in 
    LOCALE_IDEFAULTANSICODEPAGE, 
    szCodePage, 
    countof(szCodePage)); 

    nCodePage= cch>0 ? _ttoi(szCodePage) : 0; 
+0

以上簡潔に、: 'int型nCodePage = GetACP();' :)これは、コードページの名前を取得し、文字列としてコードページを取得し、その後に変換するために、かなり長いったらしいです整数 – MarkJ

+0

確かに_more succinctly_ :-D –

0
、私のために働いたおかげで、しかしとしてより簡潔に書くことができ

UINT nCodePage = CP_ACP; 
const int cch = ::GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, 
    LOCALE_RETURN_NUMBER|LOCALE_IDEFAULTANSICODEPAGE, 
    (LPTSTR)&nCodePage, sizeof(nCodePage)/sizeof(_TCHAR)); 
+0

私の答えと同じように、あるいはもっと簡潔です: 'int nCodePage = GetACP();' :)コードページの* name *を取得してから、 – MarkJ

関連する問題