我正在寻找一种使用 VBA 将数据传输到字符集 CP437 的文本文件的方法。 有关字符集的更多信息:https://www.ascii-code.com/CP437
为了简单起见,我只有一行将在下面的代码中打印,但实际上它包含大约 100 万行数据,其中包含更多信息。
有人知道如何让它工作吗?如果我使用 utf-8,我可以获得正确的字符,但是我不遵守 SIE 文件的标准。 https://sie.se/in-english/
尝试在注册表中找到它,因为这应该是可以写的: HKEY_CLASSES_ROOT\MIME\Database\Charset https://learn.microsoft.com/en-us/sql/ado/reference/ado-api/charset-property-ado?view=sql-server-ver16
Sub Test()
Dim fsT As Object: Set fsT = CreateObject("ADODB.Stream")
fsT.Type = adTypeText
fsT.Charset = "ASCII"
fsT.Open
fsT.WriteText "#FNAMN " & """Test åäö""" & Chr(10)
fsT.SaveToFile newFilePath, adTypeText
End Sub
是的,这可以通过使用一些 API 函数来实现。我最近编写了一个 VBA 库,它包装了适用于 Windows 和 Mac 的这些 API 函数,并提供了一个独立于操作系统的 API 用于转码字符串。
在这里看一下:VBA-StringTools
不幸的是,我还没有为该库编写单独的文档,但代码记录在各个过程上方的横幅注释中。我还将给您一些代码,您可以在这里尝试。
这个想法是使用 API 函数在 VBA 中完成所有转码,然后将结果字节写入文件。
如您所知,普通的 VBA 字符串在内部是 UTF-16LE 编码的,因此如果您的数据来自 VBA 或 Excel,您可以使用库中的
Encode
函数(它假定 UTF-16LE 输入),否则如果您知道您的数据已经以不同的方式编码,只需使用 Transcode
函数即可。
此子演示了
Encode
的用法:
Sub ExampleSub()
Dim vbaString As String
vbaString = "#FNAMN " & """Test åäö""" & Chr(10)
'Note:
'Requires library VBA-StringTools: https://github.com/guwidoe/VBA-StringTools
'Encode() returns a String, but String can be assigned to Byte() in VBA
Dim b() As Byte: b = Encode(vbaString, cpIBM437)
Dim path As String
path = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\File.txt"
Dim fileNum As Long: fileNum = FreeFile
Open path For Binary Access Write As #fileNum
Put #fileNum, 1, b
Close #fileNum
End Sub