VB6에서 런타임에서 주어진 LCID에 대한 올바른 숯을 결정하는 가장 좋은 방법은 무엇입니까?

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

문제

일본으로 설정된 시스템 로케일과 비 유니 코드 프로그램의 언어를 일본어로 VB6 응용 프로그램에 표시하고 있습니다. getAcp ()에 대한 호출은 일본어의 경우 932를 올바르게 반환합니다. 일본어 문자열을 내 컨트롤에 삽입하면 "アフリカ の 女王"보다는 "ƒa + t Š Jj − ¤"로 표시됩니다. font.charset을 128로 수동으로 설정하면 올바르게 표시됩니다.

VB6에서 주어진 LCID에 대한 올바른 숯을 결정하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

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

다른 팁

두 번째로 가장 좋은 방법은 여기에서 수행 된 것과 같은 글꼴, font.charsets 및 휴리스틱 데이터베이스를 사용하는 것입니다.

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

(그만큼 베스트 방법은 VB6 인 가라 앉는 배에서 내리는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top