Bob*_*b77 19
如果您的文件不是真正巨大的(例如,即使只有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
Run Code Online (Sandbox Code Playgroud)
请注意,它将处理带有或不带BOM的UTF-8输入文件.
使用强类型和早期绑定将提高VB6中的头发性能,您不需要声明这些Const值.但这不是脚本中的选项.
对于需要处理非常大的文件的VB6程序,最好使用针对字节数组的VB6本机I/O并使用API调用来转换数据块.这增加了查找字符边界的额外混乱(UTF-8每个字符使用可变数量的字节).您需要扫描您阅读的每个数据块,以找到API转换的安全终点.
我将看看MultiByteToWideChar()和WideCharToMultiByte()来开始.
请注意,UTF-8通常使用LF行分隔符"到达"而不是CRLF.