Hoe creëer ik HTML-bestanden met utf-8 encoding met behulp van VBA ?

Status
Niet open voor verdere reacties.

MDN111

Gebruiker
Lid geworden
13 aug 2007
Berichten
503
Hallo !

Sorry voor de lange tekst, maar ik moet de achtergrond schetsen om m'n probleem te verduidelijken. Ik weet ook niet of deze vraag thuis hoort bij HTML of bij VBA, maar omdat de oorsprong HTML is, plaats ik het toch maar hier.
Een aantal jaren geleden deed ik een projectje met HTML voor een FAQ-pagina op het intranet waar ik werkte. Toen gebruikte ik frames voor een header, navigatie en voor de centrale inhoud. Onlangs ging ik de uitdaging aan om een kleine website te maken, met behulp van alleen Notepad en ftp. Bij het zoeken op het www merkte ik dat nogal wat veranderd is op gebied van web-ontwikkeling. Blijkbaar is het nu HTML5 en CSS3 dat de klok slaat. In de verschillende artikels en online cursussen vond ik ook terug dat het gebruik van frames voorbijgestreefd is (uitgezonderd iframes om een externe site te tonen) en dat nu divs volop van toepassing zijn. Het vervangen van frames door divs was niet zo'n probleem. Alleen verdwijnen de header en navigatiebalk van het scherm als men scrolt, maar blijkbaar zijn de meeste hedendaagse websites zo opgebouwd. Het grootste probleem voor mij was de inhoud van de HTML-pagina's. Bij het gebruik van frames open je gewoon een ander HTML-bestand in de centrale frame, maar bij divs gaat dat niet. Ik was dan verplicht om per navigatie-optie een apart HTML-bestand te openen. Ik heb dus in mijn geval zes HTML-bestanden gemaakt. Dat is op zichzelf niet zo erg, maar de code voor de header, navigatie, footer en rechterkolom staat in alle zes de HTML-bestanden. Dat is niet elegant, en het is ook inefficiënt. Als men bijvoorbeeld iets aan de header wil wijzigen moet men dat in alle zes de HTML-bestanden doen. Bijzonder onpraktisch, maar ik had er een oplossing voor gevonden: per navigatie-optie (dus zes) heb ik een txt-bestand gemaakt met bijkomend nog een txt-bestand voor de header, navigatiebalk, footer en rechterkolom. Met behulp van Excel laat ik dan een VBA macro de zes HTML-bestanden genereren en dat werkt prima. So far so good.
Maar bij verdere opzoekingen vind ik terug dat men absoluut een charset moet specifiëren en dat die utf-8 moet zijn om compatibel te zijn met HTML5. Ik dacht dat even te fixen, maar dat loopt serieus fout. Eerst heb ik de meta tag met charset="utf-8" in het gepaste txt-bestand ingevoerd. Vervolgens alle txt-bestanden geopend met Notepad en opgeslagen met encoding = utf-8 en dan de zes HTML-bestanden gegenereerd met de VBA macro. Het resultaat is dat characters boven code 128 foutief getoond worden in de browser. Die gaat er van uit dat de HTML-bestanden een utf-8-encoding hebben, maar blijkbaar is dat niet zo.
Om de HTML-bestanden te creëren gebruik ik de OpenTextFile() en CreateTextFile() methodes van een FileSystemObject en ik heb zowat alle combinaties van format- en tristate-parameters geprobeerd, echter zonder resultaat. Blijkbaar lukt het mij niet om met CreateTextFile() een output te bekomen met utf-8-encoding. (opmerking: als ik de gegenereerde HTML-bestanden één voor één open met Notepad en opsla met utf-8 dan lukt het wel, maar dat vind ik dan weer te omslachtig).

Iemand een idee?

Grtz,
MDN111.
 
Ik heb het nooit specifiek geprobeerd voor webgebruik, maar gebruik je opentextfile met de unicode optie?

Volgens mij is de unicode optie utf-16, maar mogelijk is het wel compatible met wat jij ermee wil. als het echt utf-8 moet zijn is er nog wel een mogelijkheid met de adodb.stream class:

code gevonden op internet:
Code:
Sub WriteUTF8WithoutBOM()
    Dim UTFStream As Object
    Set UTFStream = CreateObject("adodb.stream")
    UTFStream.Type = adTypeText
    UTFStream.Mode = adModeReadWrite
    UTFStream.Charset = "UTF-8"
    UTFStream.LineSeparator = adLF
    UTFStream.Open
    UTFStream.WriteText "This is an unicode/UTF-8 test.", adWriteLine
    UTFStream.WriteText "First set of special characters: öäåñüûú€", adWriteLine
    UTFStream.WriteText "Second set of special characters: qwertzuiopõúasdfghjkléáûyxcvbnm\|Ä€Í÷×äðÐ[]í³£;?¤>#&@{}<;>*~¡^¢°²`ÿ´½¨¸0", adWriteLine

    UTFStream.Position = 3 'skip BOM

    Dim BinaryStream As Object
    Set BinaryStream = CreateObject("adodb.stream")
    BinaryStream.Type = adTypeBinary
    BinaryStream.Mode = adModeReadWrite
    BinaryStream.Open

    UTFStream.CopyTo BinaryStream
    UTFStream.Flush
    UTFStream.Close

    BinaryStream.SaveToFile "d:\adodb-stream2.txt", adSaveCreateOverWrite
    BinaryStream.Flush
    BinaryStream.Close
End Sub
 
Dag Wampier !

Prettig kerstfeest !

Allereerst hartelijk bedankt voor je reply (en om mijn lange tekst te lezen).

Dat "adodb.stream"-object ken ik eigenlijk niet (limiet van mijn kennis), maar dat ziet er wel bijzonder interessant uit. Men kan een property "Charset" definiëren en Excel kent het blijkbaar ook. Ik heb even in de VBA-editor een macro ingevoerd en die werkt zonder referfence naar een extra library:
Code:
Sub test()
Dim UTFStream As Object
Set UTFStream = CreateObject("adodb.stream")
MsgBox (UTFStream.Charset)
End Sub
Na even Googelen met CreateObject("adodb.stream") kwam ik op een site van Microsoft met daarin een interessante quote: " ... the FSO is designed to read only ASCII data from the file system and, therefore, does not work..." Dat is exact wat ik deed en dus ... niet OK. Ik ga dat "adodb.stream"-object verder uitpluizen en proberen van daaruit verder te werken in plaats van met het FSO.

Grtz,
MDN111.
 
Dat van de FSO is afhankelijk van de versie. In de nieuwere versie is er een unicode versie

Als je deze gebruikt:
Code:
object.CreateTextFile("test" , true , true) 'laatste true is voor unicode support, standaard is ASCII

Deze is in UTF encoding, maar UTF 16, niet UTF-8. Daarbij gaan niet je speciale tekens verloren en dus bruikbaar voor niet-ascii gebruik. Echter of dat dan weer specifiek voor webgebruik geschikt is is een ander verhaal.

PS,

ook met CSS kun je een vaste titelbar aan je pagina hangen, je "header"/"nav" elementen "fixed" maken.
 
Laatst bewerkt:
Dag Wampier !

Ik had CreateTextFile() al eens geprobeerd met de unicode-parameter zowel True als False, maar dat was zonder resultaat. Maar met het ADODB.Stream-object gaat het prima. Ik heb gewoon de VBA-code gewijzigd zodat het lezen van de txt-bestanden en het creëren van de HMTL-bestanden allebei via een stream-object gebeuren. Nogmaals dank voor de info.

Grtz,
MDN111.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan