我在 VB6 应用程序中显示日语字符,系统区域设置设置为日本,非 Unicode 程序的语言设置为日语。 对于日语,对 GetACP() 的调用正确返回 932。 当我将日语字符串插入控件时,它们显示为“??A??t?????J??—??”而不是“afurikaの女王”。 如果我手动将 Font.Charset 设置为 128,那么它们会正确显示。
在 VB6 中确定给定 LCID 的正确字符集的最佳方法是什么?
扩展鲍勃的答案,这里有一些获取当前默认字符集的代码。
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那艘正在下沉的船上下来)
我编写了一个小型 C 程序,其中列出了所有 Windows 区域设置、LCID 和关联的字符编码(以及 Windows 代码页)。
代码可在 Github 上获取:https://github.com/lovasoa/lcid-to-codepage
由此产生的 LCID 和字符集之间的详尽映射在此处以 CSV 形式可见:https://github.com/lovasoa/lcid-to-codepage/blob/main/windows_locales_extended.csv