Каков наилучший способ определить правильную кодировку для данного LCID во время выполнения в VB6?
-
22-08-2019 - |
Вопрос
Я отображаю японские символы в приложении VB6 с системной локализацией, установленной на Japan, и языком для программ, отличных от Unicode, как японский.Вызов GetACP() корректно возвращает 932 для японского языка.Когда я вставляю японские строки в свои элементы управления, они отображаются как “Ƒaƒtƒšƒj'I—‰¤”, а не “アリリリリリリカカ".Если я вручную установлю шрифт.Наберите кодировку 128, тогда они будут отображаться правильно.
Каков наилучший способ определить правильную кодировку для данного LCID в VB6?
Решение
Расширяя ответ Боба, вот некоторый код для получения текущей кодировки по умолчанию.
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)