在VB6中,在运行时确定给定LCID的正确字符集的最佳方法是什么?

在VB6中,在运行时确定给定LCID的正确字符集的最佳方法是什么?,vb6,locale,character-encoding,lcid,Vb6,Locale,Character Encoding,Lcid,我正在VB6应用程序中显示日语字符,系统语言环境设置为Japan,非Unicode程序的语言设置为日语。对GetACP()的调用正确地返回日语的932。当我将日文字符串插入控件时,它们显示为“ƒAƒtƒŠƒJÌ-Ìアフリカの女王”. 如果我手动将Font.Charset设置为128,则它们将正确显示 在VB6中确定给定LCID的正确字符集的最佳方法是什么?第二种最佳方法是使用字体、font.Charset和启发式的数据库,如下所示: (最好的方法是离开正在下沉的船,即VB6)请参见扩展Bob

我正在VB6应用程序中显示日语字符,系统语言环境设置为Japan,非Unicode程序的语言设置为日语。对GetACP()的调用正确地返回日语的932。当我将日文字符串插入控件时,它们显示为“ƒAƒtƒŠƒJÌ-Ìアフリカの女王”. 如果我手动将Font.Charset设置为128,则它们将正确显示


在VB6中确定给定LCID的正确字符集的最佳方法是什么?

第二种最佳方法是使用字体、font.Charset和启发式的数据库,如下所示:


(最好的方法是离开正在下沉的船,即VB6)

请参见扩展Bob的答案,下面是一些获取当前默认字符集的代码

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