Yogi
Yogi

Reputation: 3

How to change encoding from UTF-8 to UTF-8-BOM of exported *.txt files from Excel?

Exported text files from Excel are encoded with UTF-8.

An encoding UTF-8-BOM is needed.

I think that in code shall be inserted a row, written like:

Java

?xml version="1.0" encoding="UTF-8"?

Jasperreport CSV UTF-8 without BOM instead of UTF-8

or

HTML5

meta charset="utf-8"

Bad UTF-8 without BOM encoding

Sub export_data()
Dim row, column, i, j As Integer
Dim fullPath, myFile As String

fullPath = "C:\Workspace"
row = 21
column = 5

For i = 1 To column
    myFile = Cells(1, i).Value + ".txt"
    myFile = fullPath + "/" + myFile
    Open myFile For Output As #1
    For j = 2 To row
        Print #1, Cells(j, i).Value
    Next j
    Close #1
Next i

End Sub

How can I define and where to put a row, which defines encoding UTF-8-BOM? Thank You.

Upvotes: 0

Views: 2509

Answers (1)

Ron Rosenfeld
Ron Rosenfeld

Reputation: 60174

Instead of Printing the file line by line, it might be more efficient to

  • save your selected range as a CSV UTF-8
    • you might need to change the file type after saving
  • Use ADO to process the file as UTF-8

Either will add a BOM automatically.

EDIT

If you are unfamiliar, you could perform the save to csv - utf8 process manually with the macro recorder turned on. Then examine what you have recorded and make appropriate edits.

Another way of adding the BOM, in the context of your existing code, would be to write it directly as a byte array to the first line.

For example:

Dim BOM(0 To 2) As Byte 'EF BB BF
    BOM(0) = &HEF
    BOM(1) = &HBB
    BOM(2) = &HBF

Open myFile For Binary Access Write As #1
    Put #1, 1, BOM
Close #1

will put the BOM at the beginning of the file. You should then change the mode in your subsequent Print code to Append.

I suggest you read about the pros and cons of using Print vs Write

You should also read about declaration statements. In yours, only the last variable on each line is being declared as the specified type; the preceding variables are being implicitly declared as being of type Variant.

Upvotes: 0

Related Questions