¿Cuál es la mejor manera de determinar el juego de caracteres correcto para un LCID dada en tiempo de ejecución en Visual Basic 6?

StackOverflow https://stackoverflow.com/questions/377779

Pregunta

estoy mostrando caracteres japoneses en una aplicación de Visual Basic 6 con la configuración regional del sistema se establece en Japón y el idioma para programas no Unicode como el japonés. Una llamada a GetACP () devuelve correctamente 932 para los japoneses. Al insertar las cadenas japonesas en mis controles que se muestran como “ƒAƒtƒŠƒJ,Ì- ‰ ¤” en lugar de “ア フ リ カ の 女王”. Si fijo manualmente el Font.Charset a 128 luego se muestran correctamente.

¿Cuál es la mejor manera de determinar el juego de caracteres correcto para un determinado LCID en VB6?

¿Fue útil?

Solución

La ampliación de la respuesta de Bob, aquí hay algo de código para obtener el conjunto de caracteres por defecto actual.

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

Otros consejos

La segunda mejor manera es utilizar una base de datos de fuentes, font.charsets, y heurística, tal como se hace aquí:

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

( mejor manera es bajar del barco que se hunde que es VB6)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top