Lister les pages de code supportées par windows

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

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.