如果您的文件并不是很大(例如,即使只有 40MB 也会非常慢),您可以在 VB6、VBA 或 VBScript 中使用以下代码来完成此操作:
Option Explicit
Private Const adReadAll = -1
Private Const adSaveCreateOverWrite = 2
Private Const adTypeBinary = 1
Private Const adTypeText = 2
Private Const adWriteChar = 0
Private Sub UTF8toANSI(ByVal UTF8FName, ByVal ANSIFName)
Dim strText
With CreateObject("ADODB.Stream")
.Open
.Type = adTypeBinary
.LoadFromFile UTF8FName
.Type = adTypeText
.Charset = "utf-8"
strText = .ReadText(adReadAll)
.Position = 0
.SetEOS
.Charset = "_autodetect" 'Use current ANSI codepage.
.WriteText strText, adWriteChar
.SaveToFile ANSIFName, adSaveCreateOverWrite
.Close
End With
End Sub
UTF8toANSI "UTF8-wBOM.txt", "ANSI1.txt"
UTF8toANSI "UTF8-noBOM.txt", "ANSI2.txt"
MsgBox "Complete!", vbOKOnly, WScript.ScriptName
请注意,它将处理带或不带 BOM 的 UTF-8 输入文件。
使用强类型和早期绑定将提高 VB6 中的性能,并且您不需要声明这些 Const 值。但这不是脚本中的选项。
对于需要处理非常大文件的 VB6 程序,您最好使用 VB6 本机 I/O 来处理字节数组,并使用 API 调用来转换数据块。不过,这增加了查找字符边界的额外混乱(UTF-8 每个字符使用可变的字节数)。您需要扫描读取的每个数据块,以找到 API 翻译的安全终点。
我会看看 MultiByteToWideChar() 和 WideCharToMultiByte() 来开始。
请注意,UTF-8 通常“到达”时带有 LF 行分隔符,而不是 CRLF。