システム ロケールを日本に設定し、Unicode 以外のプログラムの言語を日本語に設定して、VB6 アプリケーションで日本語の文字を表示しています。GetACP() を呼び出すと、日本語に対して正しく 932 が返されます。日本語の文字列をコントロールに挿入すると、「アフリカの女王」ではなく「ƒAƒtƒŠƒJ‚Ì—‰¤」と表示されます。Font.Charset を手動で 128 に設定すると、正しく表示されます。
VB6 で特定の LCID の正しい文字セットを決定する最良の方法は何ですか?
システム ロケールを日本に設定し、Unicode 以外のプログラムの言語を日本語に設定して、VB6 アプリケーションで日本語の文字を表示しています。GetACP() を呼び出すと、日本語に対して正しく 932 が返されます。日本語の文字列をコントロールに挿入すると、「アフリカの女王」ではなく「ƒAƒtƒŠƒJ‚Ì—‰¤」と表示されます。Font.Charset を手動で 128 に設定すると、正しく表示されます。
VB6 で特定の LCID の正しい文字セットを決定する最良の方法は何ですか?
ボブの答えを拡張すると、現在のデフォルトの文字セットを取得するコードがいくつかあります。
Private Const LOCALE_SYSTEM_DEFAULT As Long = &H800
Private Const LOCALE_IDEFAULTANSICODEPAGE As Long = &H1004
Private Const TCI_SRCCODEPAGE = 2
Private Type FONTSIGNATURE
fsUsb(4) As Long
fsCsb(2) As Long
End Type
Private Type CHARSETINFO
ciCharset As Long
ciACP As Long
fs As FONTSIGNATURE
End Type
Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" ( _
ByVal Locale As Long, _
ByVal LCType As Long, _
ByVal lpLCData As String, _
ByVal cchData As Long _
) As Long
Private Declare Function TranslateCharsetInfo Lib "GDI32" ( _
lpSrc As Long, _
lpcs As CHARSETINFO, _
ByVal dwFlags As Long _
) As Long
Public Function GetCharset() As Long
On Error GoTo ErrorHandler
Dim outlen As Long
Dim lCodepage As Long
Dim outBuffer As String
Dim cs As CHARSETINFO
outBuffer = String$(10, vbNullChar)
outlen = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_IDEFAULTANSICODEPAGE, outBuffer, Len(outBuffer))
If outlen > 0 Then
lCodepage = val(Left$(outBuffer, outlen - 1))
If TranslateCharsetInfo(ByVal lCodepage, cs, TCI_SRCCODEPAGE) Then
GetCharset = cs.ciCharset
End If
End If
Exit Function
ErrorHandler:
GetCharset = 0
End Function
2 番目に良い方法は、フォント、font.charsets、およびヒューリスティックのデータベースを使用することです。たとえば、次のようにします。
http://www.example-code.com/vb/vb6-display-unicode.asp
(一番いい方法はVB6である沈没船から降りることです)