VB6에서 런타임에서 주어진 LCID에 대한 올바른 숯을 결정하는 가장 좋은 방법은 무엇입니까?
-
22-08-2019 - |
문제
일본으로 설정된 시스템 로케일과 비 유니 코드 프로그램의 언어를 일본어로 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 인 가라 앉는 배에서 내리는 것입니다.
제휴하지 않습니다 StackOverflow