【问题标题】:Why using ADODB.Stream with ASCII charset special chars as ä are converted to a?为什么将 ADODB.Stream 与 A​​SCII 字符集特殊字符作为 ä 转换为 a?
【发布时间】:2011-08-12 09:34:25
【问题描述】:

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

我尝试像 UTF-8 一样导出它,然后正确显示字符,但我需要输出为 ASCII。此外,对我来说,文件名通常可以包含这个字符(ä、ü、á...)而对我来说看起来很奇怪。

这可能是因为“ASCII”字符集只是基本字符集而不是扩展字符集吗?也许是因为 Windows 中配置的 CodePages?我尝试了其中几个(德语、英语),结果相同。

这是我正在使用的代码:

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

提前致谢!

【问题讨论】:

  • 作为参考,本例中的“ascii”指的是iso8859-1/codepage 1252。
  • 很高兴认识 Deanna,我想我可能混淆了字符集。我刚刚做了一个测试,我取消了我认为是基本 ASCII 的字符集 20127(US-ASCII),然后输出文件完全为空。我认为这证明我使用的是基本 ASCII 而不是扩展的 ASCII(1252),但是在区域设置中选择了此代码页。也许我必须在代码中强制它?

标签: vb6 character-encoding ascii ado codepages


【解决方案1】:

PRB: Charset Property of ADO Stream Object May Require Microsoft Internet Explorer UpgradeCharset Property (ADO) 都表明 ADO CharSet 值是列在HKEY_CLASSES_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 系统假装没有区别,但 Stream 会写入 BOM,当然那些扩展(非 ASCII)字符是多字节编码的。

【讨论】:

    【解决方案2】:

    为什么你不能做如下的事情?这对我来说没问题:

        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
    

    【讨论】:

    • 但是在我正在寻找的解决方案中,我需要能够选择编码。上面的答案对我有用。不过也谢谢你的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    相关资源
    最近更新 更多