vbscript code that helps write UTF-8 text
Posted: 2008-12-12T13:44:51-07:00
Simon Pedersen thought ImageMagick users might benefit from the following:
Hi,
I think this code should be shared. When we switched our database to storing all data in UTF-8 format, we encountered a problem when using imageMagick to write text to graphic (typically when having non standard fonts)
Using ImageMagick to write text to a graphic file from a text-file, using -annotate, resulted in a strange character before the text. It turned out that this char was the Byte Order Mark that Windows uses in UTF-8 files.
I therefore created a couple of vbscript functions that remove the BOM and resaves the file.
Kind regards,
Simon
Hi,
I think this code should be shared. When we switched our database to storing all data in UTF-8 format, we encountered a problem when using imageMagick to write text to graphic (typically when having non standard fonts)
Using ImageMagick to write text to a graphic file from a text-file, using -annotate, resulted in a strange character before the text. It turned out that this char was the Byte Order Mark that Windows uses in UTF-8 files.
I therefore created a couple of vbscript functions that remove the BOM and resaves the file.
Code: Select all
' Input is Unicode text and filePath is path to the image file we wish to create. First we create a utf-8 file
' named the same as the image file and then we use the utf-8 file as an input to when creating the image file.
strResult = img.Convert( _
"-size" , "200x200", _
"-font" , "Arial-Bold", _
"-pointsize" , "12", _
"-fill" , "#B6B6B6", _
"-annotate" , "0x0+25+18" ,writeUnicodeADODB(UCase(sText), strDefaultPath & "top_" & sFilename), _
"-trim", _
strDefaultPath & "template.png", _
strDefaultPath & "top_" & sFilename)
Function writeUnicodeADODB(txtInput,filePath)
' Create and open stream
Dim objStream
Set objStream = CreateObject("ADODB.Stream")
objStream.Open
'Reset the position and indicate the charactor encoding
objStream.Position = 0
objStream.Charset = "UTF-8"
'Write to the steam
objStream.WriteText txtInput
'Save the stream to a file
filePath = filePath & ".txt"
objStream.SaveToFile filePath, 2 ' overwrite if exists
' Return filepath with an @ so that imagemagick understands that it's a file
writeUnicodeADODB = "@" & RemoveBOM(filePath)
' Kill stream
Set objStream = Nothing
End Function
Code: Select all
' Removes the Byte Order Mark - BOM from a text file with UTF-8 encoding
' The BOM defines that the file was stored with an UTF-8 encoding.
Public function RemoveBOM(filePath)
' Create a reader and a writer
Dim writer,reader, fileSize
Set writer = CreateObject("Adodb.Stream")
Set reader = CreateObject("Adodb.Stream")
' Load from the text file we just wrote
reader.Open
reader.LoadFromFile filePath
' Copy all data from reader to writer, except the BOM
writer.Mode=3
writer.Type=1
writer.Open
reader.position=5
reader.copyto writer,-1
' Overwrite file
writer.SaveToFile filePath,2
' Return file name
RemoveBOM = filePath
' Kill objects
Set writer = Nothing
Set reader = Nothing
end Function
Simon