begin process at 2012 02 14 06:23:38
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > LISTER LES PAGES DE CODE SUPPORTÉES PAR WINDOWS

LISTER LES PAGES DE CODE SUPPORTÉES PAR WINDOWS


 Information sur la source

Note :
Aucune note
Catégorie :API Classé sous :PageCode, Page-code, api, GetCPInfoEx, GetCPInfo Niveau :Initié Date de création :27/12/2007 Date de mise à jour :31/12/2007 12:39:38 Vu :6 607

Auteur : skrol29

Ecrire un message privé
Site perso
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

 Description

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

  • 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
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



 Historique

31 décembre 2007 12:39:38 :
Plus d'explication sur les Codes Pages

 Sources du même auteur

REPOSITIONNER ET/OU ÉTIRER AUTOMATIQUEMENT LES CONTRÔLES
CURRENCY : UN TYPE MÉCONNU (MONEY SOUS SQL-SERVER)
SIMPLIFIER LES REQUÊTES SQL SOUS ADO / ADODB
TRADUCTION D'UN MONTANT NUMÉRIQUE EN EXPRESSION LITTÉRALE
Source avec Zip Source avec une capture SUPERMOUSE : DEVENEZ MANIPULATEUR

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) .NET DEPENDENCY VIEWER : ARBRE DES DÉPENDANCES D'UN ASSEMBLY... par ShareVB
Source avec Zip Source .NET (Dotnet) UTILITAIRE SKYDRIVE par MasterShadows
Source avec Zip ROTATION RAPIDE D'IMAGE par trex70
Source avec Zip Source avec une capture ENUMERATION DES PORTS TCP ET IDENTIFCATION DU PROCESS (PID) ... par Renfield
Source avec Zip Source avec une capture MOUSE SPEED AND WEIGHT : RETOUR DE FORCE VIRTUEL ! par ScSami

 Sources en rapport avec celle ci

Source avec Zip COMMUNICATION MODBUS MASTER par sergelapointe
Source avec Zip Source avec une capture AFFICHEUR TYPE DIGITAL AVEC AVEC L'API SETBITMAPBITS par oeildedinde
Source avec Zip Source avec une capture [VBA] EXCEL - UNE CALCULATRICE SUR UN USERFORM par lermite222
Source avec Zip Source avec une capture [VBA] EXCEL - DÉMO - TIRER 1, 2 OU 3 DÉS + APIS par lermite222
Source avec Zip Source avec une capture Source .NET (Dotnet) MINUTERIE ET DIVERS API par lermite222

Commentaires et avis

Commentaire de Renfield le 28/12/2007 08:02:04 administrateur CS

étrange convention des noms...

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

Commentaire de yrt007 le 28/12/2007 10:28:06

Cool pour le initiés mais pour les novices, on peut avoir, sans etre académique, quelques détails ?
merci

Commentaire de jmc70 le 31/12/2007 10:38:45

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)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

GetEnvironmentVariable [ par Boldor ] Bonjour,Je voudrai recuperer la valeur des variables d'environnement a partir d'un programme VB.Comment utiliser la fonction GetEnvironmentVariable ?Y les API windows [ par Mskine ] Où je peux trouver des informations,definitions, conseils, des fonctions APIMerci d'avance API [ par CyrilB ] Je voudrais pouvoir fermer une fenêtre MS-DOS même si celle-ci est en cours d'execution.Il y a une fonction API qui fait ça mais je ne sais plus laque Proprietes des fichiers ss NT 4.00 \ Utilisation des fonctions API [ par Xavier ] En fouillant dans l'aide des API, j'ai trouve quelques fonctions pouvant resoudre mon probleme.Qui peut me dire comment faire appel aux fonctions :Get API pour icônes [ par Xaviou ] Salut,Je suis à la recherche d'une API pour afficher la boite de dialogue de changement d'icône (boite que l'on peut obtenir, lorsque l'on regarde les API SHGetFileInfo [ par Xaviou ] Salut,quelqu'un saurait-il comment utiliser l'API SHGetFileInfo ? Pour ma part, c'est le bide complet.J'attends vos réponses avec impatience.@+Xaviou Menu avec icone [ par Xaviou ] Salutje recherche l'API pour intégrer des incones dans mes menus. J'ai trouvé une API (ModifyMenu) qui permet de remplacer le caption d'un menu par un Fonctions API [ par Yvan ] Une petite question : les fonctions API fonctionnent-elles de la même façonsur Win 95, Win 98 et Win NT ?Si je prends comme exemple la fonction GetVo Lecteurs disponibles [ par Yvan ] Salut,Je cherche le moyen de connaître les lettres des lecteurs qui se trouvent sur un ordinateur. Ce qui doit se faire avec les API selon moi. Et s


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,154 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales