Каков наилучший способ определить правильный набор символов для данного LCID во время выполнения в VB6?

Я отображаю японские символы в приложении VB6 с языковым стандартом системы, установленным на Японию, и языком для программ, не поддерживающих Unicode, как японский. Вызов GetACP() правильно возвращает 932 для японского языка. Когда я вставляю японские строки в свои элементы управления, они отображаются как «ƒAƒtƒŠƒJ‚Ì—‰¤», а не как «アフリカの女王». Если я вручную установлю для Font.Charset значение 128, они будут отображаться правильно.

Каков наилучший способ определить правильный набор символов для данного LCID в VB6?


person fran    schedule 18.12.2008    source источник


Ответы (3)


Расширяя ответ Боба, вот некоторый код для получения текущей кодировки по умолчанию.

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
person Ant    schedule 02.06.2009


Второй лучший способ — использовать базу данных шрифтов, font.charsets и эвристики, как это сделано здесь:

http://www.example-code.com/vb/vb6-display-unicode.asp

(лучший способ — сойти с тонущего корабля VB6.)

person geocar    schedule 18.12.2008