VBA - 使用 CP437(ASCII 扩展)写入文本文件

问题描述 投票:0回答:1

我正在寻找一种使用 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
vba character-encoding
1个回答
0
投票

是的,这可以通过使用一些 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
© www.soinside.com 2019 - 2024. All rights reserved.