什么是确定正确的字符集在VB6在运行时给定的LCID的最佳方式?
-
22-08-2019 - |
题
我在与所述系统区域设置为日本和用于非Unicode程序作为日语的语言一个VB6应用程序中显示日文字符。到GetACP()的调用正确日本返回932。当我插入了日本串到我控制它们显示为“ƒAƒtƒŠƒJ,Ì-‰¤”,而不是“アフリカの女王”。如果我手动设置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