Vb6 为什么使用ADODB.Stream和ASCII字符集特殊字符作为ä;是否转换为一个?

Vb6 为什么使用ADODB.Stream和ASCII字符集特殊字符作为ä;是否转换为一个?,vb6,character-encoding,ascii,ado,codepages,Vb6,Character Encoding,Ascii,Ado,Codepages,我在尝试将vb6中某些变量的内容输出到文本文件时遇到问题。问题是,当扩展ASCII中的一个特殊字符显示为ä,ü,á时,它会在输出中转换为匹配的基本ASCII字符,如a,u,a 我尝试将其像UTF-8一样导出,然后字符被正确显示,但我需要输出为ASCII。而且,对于我来说,文件名通常可以包含这个字符(ä,ü,á…)而不需要替换,这看起来很奇怪 这可能是因为“ASCII”字符集只是基本字符集而不是扩展字符集吗?可能是因为Windows中配置的代码页?我试过几次(德语、英语),结果都一样 这是我正在使

我在尝试将vb6中某些变量的内容输出到文本文件时遇到问题。问题是,当扩展ASCII中的一个特殊字符显示为ä,ü,á时,它会在输出中转换为匹配的基本ASCII字符,如a,u,a

我尝试将其像UTF-8一样导出,然后字符被正确显示,但我需要输出为ASCII。而且,对于我来说,文件名通常可以包含这个字符(ä,ü,á…)而不需要替换,这看起来很奇怪

这可能是因为“ASCII”字符集只是基本字符集而不是扩展字符集吗?可能是因为Windows中配置的代码页?我试过几次(德语、英语),结果都一样

这是我正在使用的代码:

Set fileStream = New ADODB.Stream
If Not fileStream Is Nothing Then
    inputString = textPreAppend + inputString
    fileStream.charSet = "ASCII"
    fileStream.Open
    fileStream.WriteText inputString
    fileStream.Flush
    fileStream.SaveToFile fileName, adSaveCreateOverWrite
    fileStream.Flush
    fileStream.Close
End If
Set fileStream = Nothing

提前谢谢

为什么你不能像下面这样做呢?这对我来说没问题:

    Dim FileNo As Integer
    Dim strFile As String

    strFile = "C:\Test.txt"
    FileNo = FreeFile

    Dim strVariable As String
    strVariable = "some text with extended chars in: ÙÑáêôü"

    Open strFile For Append As #FileNo

    Print #FileNo, strVariable

    Close #FileNo

为什么你不能像下面这样做呢?这对我来说没问题:

    Dim FileNo As Integer
    Dim strFile As String

    strFile = "C:\Test.txt"
    FileNo = FreeFile

    Dim strVariable As String
    strVariable = "some text with extended chars in: ÙÑáêôü"

    Open strFile For Append As #FileNo

    Print #FileNo, strVariable

    Close #FileNo
两者都表明ADO字符集值是在
HKEY\U CLASSES\U ROOT\MIME\Database\CharSet
下列出的值,但这显然不是全部内容

例如,“ascii”和“us ascii”这两个值都列为“iso-8859-1”的别名,但在“我的语言环境”设置为“美国英语”的情况下,它们的行为类似于7位ascii MIME类型。他们几乎不得不这样做,因为没有任何其他方法可以用于请求7位ASCII编码

这将产生您似乎想要的结果:

Option Explicit

Private Sub Main()
    Dim fileStream As ADODB.Stream
    Dim inputString As String
    Const FileName As String = "outputfile.txt"

    Set fileStream = New ADODB.Stream
    inputString = "The thing is that when a special character" & vbNewLine _
                & "from extended ASCII appears as ä, ü, á it" & vbNewLine _
                & "is transformed in the output to the matching" & vbNewLine _
                & "basic ASCII char like a, u, a." & vbNewLine
    With fileStream
        .Type = adTypeText
        .Charset = "iso-8859-1"
        .Open
        .WriteText inputString
        .SaveToFile FileName, adSaveCreateOverWrite
        .Close
    End With
End Sub
输出:

The thing is that when a special character
from extended ASCII appears as ä, ü, á it
is transformed in the output to the matching
basic ASCII char like a, u, a.
我们必须假设要求“ascii”(值都是小写的,但显然不区分大小写)意味着7位ascii,可能是本地化的

除非您想要UTF-8,否则使用UTF-8是个坏主意。虽然许多*nix系统假装没有区别,但流将写入BOM,当然,这些扩展(非ASCII)字符是多字节编码的。

两者都是,并表明ADO字符集值是列在
HKEY\U CLASSES\U ROOT\MIME\Database\CharSet
下的值,但这显然不是全部内容

例如,“ascii”和“us ascii”这两个值都列为“iso-8859-1”的别名,但在“我的语言环境”设置为“美国英语”的情况下,它们的行为类似于7位ascii MIME类型。他们几乎不得不这样做,因为没有任何其他方法可以用于请求7位ASCII编码

这将产生您似乎想要的结果:

Option Explicit

Private Sub Main()
    Dim fileStream As ADODB.Stream
    Dim inputString As String
    Const FileName As String = "outputfile.txt"

    Set fileStream = New ADODB.Stream
    inputString = "The thing is that when a special character" & vbNewLine _
                & "from extended ASCII appears as ä, ü, á it" & vbNewLine _
                & "is transformed in the output to the matching" & vbNewLine _
                & "basic ASCII char like a, u, a." & vbNewLine
    With fileStream
        .Type = adTypeText
        .Charset = "iso-8859-1"
        .Open
        .WriteText inputString
        .SaveToFile FileName, adSaveCreateOverWrite
        .Close
    End With
End Sub
输出:

The thing is that when a special character
from extended ASCII appears as ä, ü, á it
is transformed in the output to the matching
basic ASCII char like a, u, a.
我们必须假设要求“ascii”(值都是小写的,但显然不区分大小写)意味着7位ascii,可能是本地化的


除非您想要UTF-8,否则使用UTF-8是个坏主意。虽然许多*nix系统假装没有差异,但流将写入BOM,当然这些扩展(非ASCII)字符是多字节编码的。

作为参考,本例中的“ASCII”指的是iso8859-1/代码页1252。很高兴了解Deanna,我想我可能混淆了字符集。我刚刚做了一个测试,我取消了选择字符集20127(US-ASCII),我认为它是基本ASCII,然后输出文件是完全空的。我想这证明了我使用的是基本的ASCII而不是扩展的ASCII(1252),但是这个代码页是在区域设置中选择的。也许我必须在代码中强制它?作为参考,本例中的“ascii”指的是iso8859-1/codepage 1252。很高兴认识Deanna,我想我可能混淆了字符集。我刚刚做了一个测试,我取消了选择字符集20127(US-ASCII),我认为它是基本ASCII,然后输出文件是完全空的。我想这证明了我使用的是基本的ASCII而不是扩展的ASCII(1252),但是这个代码页是在区域设置中选择的。也许我必须在代码中强制它?但是在我搜索的解决方案中,我需要能够选择Encoding。上面的答案确实对我有用。但也谢谢你的回答!但在我搜索的解决方案中,我需要能够选择Encoding。上面的答案确实对我有用。但也谢谢你的回答!