[Func] _OEMToAnsi / _AnsiToOEM convertir texte ANSI<=>OEM

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

[Func] _OEMToAnsi / _AnsiToOEM convertir texte ANSI<=>OEM

#1

Message par Tlem »

Voici deux fonctions qui vous permettrons de convertir le retour de vos commande DOS (qui sont au format OEM) en texte lisible par Windows (format ANSI) et inversement

Code : Tout sélectionner

Func _OEMToAnsi($sOEM)
    Local $a_AnsiFName = DllCall('user32.dll', 'Int', 'OemToChar', 'str', $sOEM, 'str', '')
    If @error = 0 Then $sAnsi = $a_AnsiFName[2]
    Return $sAnsi
EndFunc   ;==>_OEMToAnsi

Func _AnsiToOEM($sAnsi)
    Local $a_OEMFName = DllCall('user32.dll', 'Int', 'CharToOem', 'str', $sAnsi, 'str', '')
    If @error = 0  Then Return $a_OEMFName[2]
EndFunc   ;==>_AnsiToOEM
Voici un petit exemple de ce que cela peut donner pour _OEMToAnsi() :

Code : Tout sélectionner

Dim $Foo, $line
$Foo = Run(@ComSpec & ' /c DIR', @ScriptDir, @SW_HIDE, 2) ; 2 = $STDOUT_CHILD
; Lecture du STDOut
While 1
    $line &= StdoutRead($Foo)
    If @error Then ExitLoop
WEnd

MsgBox(0, 'Version OEM', $line)
MsgBox(0, 'Version ANSI', _OEMToAnsi($line))

Func _OEMToAnsi($sOEM)
    Local $a_AnsiFName = DllCall('user32.dll', 'Int', 'OemToChar', 'str', $sOEM, 'str', '')
    If @error = 0 Then $sAnsi = $a_AnsiFName[2]
    Return $sAnsi
EndFunc   ;==>_OEMToAnsi
Avatar du membre
tofu
Niveau 3
Niveau 3
Messages : 30
Enregistré le : mar. 15 avr. 2008 14:48
Status : Hors ligne

Re: [Func] _OEMToAnsi => Convertir du texte DOS en Texte Windows

#2

Message par tofu »

Bonjour,

Si je peux me permettre, il y a peu j'ai été confronté à un problème de conversion de ce type. Il est apparu après quelques recherches deux solutions. Celle que vous présentez ici, et une autre qui consiste à utiliser l'objet "OlePrn.OleCvt" de Windows.

Quelques infos sur les propriétés de cette interface et notamment sur les deux fonctions que sont ToUnicode() et ToUtf8().

Pour montrer un cas concret, je vais reprendre votre exemple de conversion OEM/ANSI:

Code : Tout sélectionner

Dim $Foo, $line
$Foo = Run(@ComSpec & ' /c DIR', @ScriptDir, @SW_HIDE, 2) ; 2 = $STDOUT_CHILD
; Lecture du STDOut
While 1
    $line &= StdoutRead($Foo)
    If @error Then ExitLoop
WEnd

MsgBox(0, 'Version OEM', $line)
MsgBox(0, 'Version ANSI', _ChangePageCode($line,1))

Func _ChangePageCode($sString, $iPageCode)
    Local $objConv = ObjCreate("OlePrn.OleCvt")
    return $objConv.ToUnicode($sString,$iPageCode)
EndFunc
 
L'intérêt de cette méthode réside dans la possibilité de spécifier dynamiquement le page code (desfois que quelqu'un veuille convertir sa chaîne en caractères japonais ? :mrgreen: )

Voilà, ce n'est pas grand chose, mais ça peut rendre service au besoin :wink:

Cordialement,
L'informatique, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [Func] _OEMToAnsi => Convertir du texte DOS en Texte Windows

#3

Message par ani »

C'est une solution, mais cette objet sert essentiellement pour l'impression (OlePrn.OleCvt= Print convertion ?), en prime elle n'est pas présente sur tout les windows, le minimum est le 2000 :(

Merci pour cette manipulation.

Il existe encore d'autre solution. ^^'
Avatar du membre
funkey
Niveau 2
Niveau 2
Messages : 17
Enregistré le : mer. 25 nov. 2009 08:32
Localisation : Austria
Status : Hors ligne

Re: [Func] _OEMToAnsi => Convertir du texte DOS en Texte Windows

#4

Message par funkey »

Thank you Tlem for posting this function. It is very usefull!!
One problem is, that the string must not be to long.

Code : Tout sélectionner

Func _GetAllFolders($sPath = @HomeDrive)
    ;funkey 04.12.2009
    Local $line, $aFolder
    Local $cmd = 'dir /ad /b /s "' & $sPath & '\"'
    Local $Pid = Run(@ComSpec & " /c " & $cmd, "", @SW_HIDE, 2)
    While 1
        $line &= StdoutRead($Pid, 0, 0)
        If @error Then ExitLoop
    WEnd
    $line = _OEMToAnsi($line)
    $aFolder = StringSplit($line, @CRLF, 3)
    ReDim $aFolder[UBound($aFolder) - 1]
    Return $aFolder
EndFunc   ;==>_GetAllFolders
 
The resulting string is often to long, so I have to do it this way:

Code : Tout sélectionner

Func _GetAllFolders($sPath = @HomeDrive)
    ;funkey 04.12.2009
    Local $line, $aFolder
    Local $cmd = 'dir /ad /b /s "' & $sPath & '\"'
    Local $Pid = Run(@ComSpec & " /c " & $cmd, "", @SW_HIDE, 2)
    While 1
        $line &= StdoutRead($Pid, 0, 0)
        If @error Then ExitLoop
    WEnd
    $aFolder = StringSplit($line, @CRLF, 3)
    ReDim $aFolder[UBound($aFolder) - 1]
    For $i = 0 To UBound($aFolder) - 1
        $aFolder[$i] = _OEMToAnsi($aFolder[$i])
    Next
    Return $aFolder
EndFunc   ;==>_GetAllFolders
 
Autoit toujours
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [Func] _OEMToAnsi / _AnsiToOEM convertir texte ANSI<=>OEM

#5

Message par Tlem »

Petite mise à jour pour rajouter la conversion ANSI => OEM. ;)
Cela peux servir pour ceux qui veulent créer une application console.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre