Qual é a melhor maneira de determinar o Charset correto para um determinado LCID em tempo de execução em VB6?

votos
3

Estou exibir caracteres japoneses em um aplicativo VB6 com a localidade do sistema definida para o Japão e o idioma para programas não Unicode como japonês. Uma chamada para GetACP () retorna correctamente 932 para japonês. Quando eu inserir as cordas japoneses em meus controles exibem como “ƒAƒtƒŠƒJ,Ì- ‰ ¤” em vez de “ア フ リ カ の 女王”. Se eu definir manualmente o Font.Charset a 128, em seguida, eles são exibidos corretamente.

Qual é a melhor maneira de determinar o Charset correto para um determinado LCID em VB6?

Publicado 18/12/2008 em 14:07
fonte usuário
Em outras línguas...                            


3 respostas

votos
2

Expandir a resposta de Bob, aqui está algum código para obter o charset padrão atual.

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
Respondeu 02/06/2009 em 15:19
fonte usuário

Respondeu 25/12/2008 em 07:17
fonte usuário

votos
1

A segunda melhor maneira é usar um banco de dados de fontes, font.charsets, e heurística, como é feito aqui:

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

(A melhor maneira é sair do navio afundando que é VB6)

Respondeu 18/12/2008 em 14:16
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more