VB6/VBScript将文件编码更改为ansi

Her*_*art 12 vb6 vbscript encoding vba ansi

我正在寻找一种方法将UTF8编码的文本文件转换为ANSI编码.

我如何在Visual Basic(VB6)和/或vbscript中实现这一目标?

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.

  • 顺便说一下,`CharSet`应该是"_autodetect_all"!在`HKCR\Mime\Database\Charset\_autodetect`值`Codepage`是50932然后在`HKCR\Mime\Database\Codepage\50932`值`Description`是"日语(自动选择)" - 显然不是匹配"使用当前ANSI代码页"意图. (4认同)