Lister les pages de code supportées par windows

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 504 fois - Téléchargée 18 fois

Contenu du snippet

Les Pages de Codes (Code Page en anglais) sont les manières d'encoder des caractères dans des fichiers binaires. ANSI, Unicode (UTF), EBCDIC sont des pages de codes. Mais ils peuvent se décliner aussi par version et par alphabet (accentué, cyrillique, chinois, ...).

Pour la lecture, import et la transcodage des données, Windows supporte environs 152 pages de codes.
Référence : http://msdn2.microsoft.com/en-us/library/ms776446(VS.85).aspx

Mais toutes les pages de codes ne sont pas forcément installées ou supportées par votre configuration. Pour connaitre quelles pages de codes sont installées et/ou supportées par votre système, il existe l'API EnumSystemCodePages.

Le code Visual Basic suivant vous permet de retrouver ces pages de codes en exploitant l'API.
Exécutez la fonction f_CodePage_Init() et cela remplie la variable globale g_CodePageLst() avec les pages de code supportées par la version de Windows installée. La variable g_CodePageNbr retourne le nombre de pages de code listées.

Source / Exemple :


Option Explicit

' Call f_CodePage_Init() to feed the global varibales g_CodePageLst() and g_CodePageNbr
'  with the Code Pages supported by the current Windows installation.
' 2007-12-27, Skrol29

Private Const MAX_LEADBYTES = 12
Private Const MAX_DEFAULTCHAR = 2
Private Const MAX_PATH = 260

Private Type CPINFOEX
  MaxCharSize As Long ' max length (Byte) of a char
  DefaultChar(0 To MAX_DEFAULTCHAR - 1) As Byte ' default character
  LeadByte(0 To MAX_LEADBYTES - 1) As Byte ' lead byte ranges
  UnicodeDefaultChar As Byte
  CodePage As Long
  CodePageName(0 To MAX_PATH - 1) As Byte
End Type

Private Declare Function api_EnumSystemCodePages Lib "kernel32.dll" Alias "EnumSystemCodePagesA" (ByVal lpCodePageEnumProc As Long, ByVal dwFlags As Long) As Long
Private Declare Sub api_CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function api_GetCPInfoEx Lib "kernel32" Alias "GetCPInfoExA" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpCPInfoEX As CPINFOEX) As Long

' EnumSystemCodePages
Const CP_INSTALLED = &H1
Const CP_SUPPORTED = &H2

Public Type tCodePage
  Id As Long
  Name As String
End Type
Public g_CodePageLst() As tCodePage
Public g_CodePageNbr As Long

Public Sub f_CodePage_Init()

  If g_CodePageNbr > 0 Then Exit Sub
  
  ' Call the CallBack as much time as there are CodePage
  api_EnumSystemCodePages AddressOf f_CodePage_CallBack, CP_INSTALLED

End Sub

Public Function f_CodePage_CallBack(CP_Pointer As Long) As Long
' Returns TRUE to continue enumeration or FALSE otherwise.

  Dim Buffer As String
  Dim Id As Long
  Dim x As String
  Dim CodePage As tCodePage
  
  Buffer = Space$(255)
  Call api_CopyMemory(ByVal Buffer, CP_Pointer, Len(Buffer))
  Buffer = Left$(Buffer, InStr(Buffer, Chr$(0)) - 1)

  CodePage.Id = Val(Buffer)
  
  If CodePage.Id > 0 Then
    ' Save the CodePage is the list
    CodePage.Name = f_CodePage_Name(CodePage.Id)
    ReDim Preserve g_CodePageLst(0 To g_CodePageNbr)
    g_CodePageLst(g_CodePageNbr) = CodePage
    g_CodePageNbr = g_CodePageNbr + 1
  End If
  
  f_CodePage_CallBack = 1

End Function

Public Function f_CodePage_Name(Id As Long) As String

  Dim CpInfo As CPINFOEX
  Dim x As String
  Dim i As Integer
  Dim ok As Boolean
  
  Call api_GetCPInfoEx(Id, 0, CpInfo)
  
  With CpInfo
  
    ' Retrieve the full name
    i = LBound(.CodePageName)
    ok = True
    Do While ok And (i <= UBound(.CodePageName))
      If .CodePageName(i) = 0 Then
        ok = False
      Else
        x = x & Chr$(.CodePageName(i))
        i = i + 1
      End If
    Loop
    
    ' Take of the number. Names can be formated like "1234 (name)"
    i = InStr(x, "(")
    If (.CodePage > 0) And (i > 0) And (Right(x, 1) = ")") Then
      If Val(Left$(x, i - 1)) = .CodePage Then
        x = Mid$(x, i + 1)
        x = Left$(x, Len(x) - 1)
      End If
    End If
    
    ' If no name => display the id
    If x = vbNullString Then
      x = "{" & .CodePage & "}"
    End If
    
  End With
  
  f_CodePage_Name = x
  
End Function

A voir également

Ajouter un commentaire

Commentaires

jmc70
Messages postés
77
Date d'inscription
samedi 9 novembre 2002
Statut
Membre
Dernière intervention
6 juillet 2014
-
Je me demandais aussi à quoi correspondait cette liste des code de pages (la variable de type Long laissait entendre qu'il y en avait plusieurs milliers).
Pour le savoir, j'ai donc placé le code ci-dessus dans un module et le code ci-dessous dans une feuille sur laquelle se trouve un bouton Command1 et une liste Liste1 :

Private Sub Command1_Click()
Dim i As Long
Call f_CodePage_Init
For i = 0 To g_CodePageNbr - 1
Liste1.AddItem Str$(g_CodePageLst(i).Id) + " " + g_CodePageLst(i).Name
Next i
End Sub

S'affiche ainsi la liste des codes supportés (55 sur ma machine). Ce qui se présente comme ceci (pour les premiers) :

10000 MAC - romain
10006 MAC - grec I
10007 MAC - cyrillique
10010 MAC - Roumanie
10017 MAC - Ukraine
10029 MAC - latin II
10079 MAC - islandais
10081 MAC - turc
10082 MAC - croate
1026 IBM EBCDIC - Turque (Latin-5)
yrt007
Messages postés
13
Date d'inscription
samedi 31 juillet 2004
Statut
Membre
Dernière intervention
17 août 2010
-
Cool pour le initiés mais pour les novices, on peut avoir, sans etre académique, quelques détails ?
merci
Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57 -
étrange convention des noms...

surtout ce f_ qui préfixe les fonctions...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.