- · Niveau : INTERMÉDIAIRE
- · Compatibilité : IIS 4
Windows utilise l’encodage UTF-16LE comme encodage naturel du texte Unicode. Développé dans les premiers jours de l’Unicode, et avant l’invention de l’UTF-8, le support UTF-8 de Windows est complètement déficient. En effet, ce schéma de nommage erroné est devenu une partie de l’interface utilisateur de Windows. Un éditeur de texte qui utilise le support de codage de Windows pour fournir une gamme d’encodages décrira automatiquement et de manière inappropriée UTF-16LE comme « Unicode » (et UTF-16BE comme « Unicode big-endian »). Noter que certaines applications natives de Windows qui développe leurs propres encodages, comme Notepad ++, n’ont pas ce problème.
Mais voilà, même si les Anglais n’ont pas ce problème, les autres doivent impérativement travailler avec des encodages UTF-8!
Ouvrir un fichier UTF-8 sous Windows ne se fait jamais sans heurt! Qui n’a jamais vu son texte parsemé de caractères chinois? L’objet FSO (File System Object) par exemple, généralement utilisé par les développeurs VBScript ou ASP pour lire et écrire des fichiers texte, ne peut lire que des fichiers texte ASCII ou Unicode. Vous ne pouvez pas l’utiliser pour lire ou écrire des fichiers texte encodés UTF-8 même si la littérature et les exemples disent le contraire!
Mais vous pouvez utiliser le « Microsoft ActiveX Data Objects (ADO) » pour lire et écrire des fichiers texte encodés UTF-8 sans aucun problème!
Lire un fichier
Dim oStream, sTexte Set oStream = CreateObject("ADODB.Stream") oStream.CharSet = "utf-8" oStream.Open oStream.LoadFromFile("C:\web\site\test.txt") sTexte = oStream.ReadText()
Écrire un fichier
Dim oStream Set oStream = CreateObject("ADODB.Stream") oStream.CharSet = "utf-8" oStream.Open oStream.WriteText "Texte encodé UTF-8" oStream.SaveToFile "C:\web\site\test.txt", 2
* Le paramètre « 2 » spécifie si un fichier doit être créé ou écrasé lors de la sauvegarde d’un objet Stream. Les valeurs peuvent être adSaveCreateNotExist
ou adSaveCreateOverWrite
.
Constante | Valeur | Description |
---|---|---|
adSaveCreateNotExist | 1 | Valeur par défaut. Crée un nouveau fichier si le fichier spécifié par le paramètre NomFichier n’existe pas déjà. |
adSaveCreateOverWrite | 2 | Remplace le fichier par les données de l’objet Stream actuellement ouvert si le fichier spécifié par le paramètre NomFichier existe déjà. Si le fichier spécifié par le paramètre NomFichier n’existe pas, un nouveau fichier est créé. |
Fonction pour ajouter une ligne à un fichier
L’idée est simple, si le fichier existe, on récupère le texte et on ajoute le nouveau texte. Et on termine en écrivant le nouveau fichier. Cette fonction permet d’ajouter le nouveau texte à la fin ou au début du fichier.dim sCheminfichier, sMonTexte const nApres = 0 const nAvant = 1 sCheminfichier = Server.MapPath(".")&"\test.txt" sMonTexte = "Buvons, chers amis, buvons : Le temps qui fuit nous y convie ; Profitons de la vie Autant que nous pouvons." call twEcritFichierADO(sCheminfichier,sMonTexte,nApres) function twEcritFichierADO(sCheminTemp,sTexteTemp,nTypeTemp) Dim oFSO, oStream, sChaineTemp sChaineTemp = sTexteTemp Set oStream = CreateObject("ADODB.Stream") oStream.CharSet = "UTF-8" set oFSO = CreateObject("Scripting.FileSystemObject") if oFSO.FileExists(sCheminTemp) then oStream.CharSet = "utf-8" oStream.Open oStream.LoadFromFile(sCheminTemp) if nTypeTemp = 0 then response.write " Écriture après la dernière ligne du fichier" sChaineTemp = oStream.ReadText() & sChaineTemp&vbCrLf else response.write "Écriture avant la première ligne du fichier" sChaineTemp = sChaineTemp &vbCrLf& oStream.ReadText() end if oStream.Close else response.write "NOUVEAU" sChaineTemp = sChaineTemp &vbCrLf end if oStream.Open oStream.WriteText sChaineTemp oStream.SaveToFile sCheminTemp, 2 oStream.Close end function
Exemple de lecture/écriture binaire avec encodage/décodage Base64 par GHad
' ' Call via cmd: cscript ReadFileEncodeBase64DecodeBase64WriteFile.vbs [pathToFile] ' ' - Reads file from arg into byte array ' - Encodes byte array to Base64 String ' - Decodes Base64 String to byte array ' - Writes byte array to new file ' ' Sample WITHOUT any warrenty! Use at own risk! Copyright 2008 Gerhard Balthasar ' Option Explicit ' common consts Const TypeBinary = 1 Const ForReading = 1, ForWriting = 2, ForAppending = 8 ' getting file from args (no checks!) Dim arguments, inFile, outFile Set arguments = WScript.Arguments inFile = arguments(0) outFile = "new_" & inFile Dim inByteArray, base64Encoded, base64Decoded, outByteArray inByteArray = readBytes(inFile) base64Encoded = encodeBase64(inByteArray) Wscript.echo "Base64 encoded: " + base64Encoded base64Decoded = decodeBase64(base64Encoded) writeBytes outFile, base64Decoded Wscript.echo "Finished!" private function readBytes(file) dim inStream ' ADODB stream object used set inStream = WScript.CreateObject("ADODB.Stream") ' open with no arguments makes the stream an empty container inStream.Open inStream.type= TypeBinary inStream.LoadFromFile(file) readBytes = inStream.Read() end function private function encodeBase64(bytes) dim DM, EL Set DM = CreateObject("Microsoft.XMLDOM") ' Create temporary node with Base64 data type Set EL = DM.createElement("tmp") EL.DataType = "bin.base64" ' Set bytes, get encoded String EL.NodeTypedValue = bytes encodeBase64 = EL.Text end function private function decodeBase64(base64) dim DM, EL Set DM = CreateObject("Microsoft.XMLDOM") ' Create temporary node with Base64 data type Set EL = DM.createElement("tmp") EL.DataType = "bin.base64" ' Set encoded String, get bytes EL.Text = base64 decodeBase64 = EL.NodeTypedValue end function private Sub writeBytes(file, bytes) Dim binaryStream Set binaryStream = CreateObject("ADODB.Stream") binaryStream.Type = TypeBinary 'Open the stream and write binary data binaryStream.Open binaryStream.Write bytes 'Save binary data to disk binaryStream.SaveToFile file, ForWriting End Sub
Source : GHads mind