Quelle est la meilleure façon de déterminer le jeu de caractères correct pour un LCID donné lors de l'exécution en VB6?
-
22-08-2019 - |
Question
Je suis des caractères japonais dans l'affichage d'une application VB6 avec les paramètres régionaux du système mis au Japon et la langue pour les programmes non Unicode comme japonais. Un appel à GetACP () retourne correctement 932 pour le japonais. Lorsque j'insère les chaînes japonaises dans mes contrôles qu'ils affichent comme « ƒAƒtƒŠƒJ,Ì- ‰ ¤ » plutôt que « ア フ リ カ の 女王 ». Si je mets manuellement à 128 l'Font.Charset ils affichent correctement.
Quelle est la meilleure façon de déterminer le jeu de caractères correct pour un LCID donné VB6?
La solution
Élargir la réponse de Bob, voici un code pour obtenir le jeu de caractères par défaut actuel.
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
Autres conseils
La deuxième meilleure façon est d'utiliser une base de données des polices, font.charsets et heuristiques, comme cela se fait ici:
http://www.example-code.com/vb /vb6-display-unicode.asp
( meilleurs moyen est de descendre du navire en perdition qui est VB6)