Зачем использовать ADODB.Stream с ASCII-кодировками специальных символов, поскольку ä преобразуются в a? - PullRequest
0 голосов
/ 12 августа 2011

У меня проблема при попытке вывести содержимое некоторых переменных в 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

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 13 августа 2011

Оба PRB: свойство Charset объекта потока ADO может потребовать обновления Microsoft Internet Explorer и Свойство Charset (ADO) предполагает, что значения ADO CharSet перечислены в HKEY_CLASSES_ROOT\MIME\Database\Charset, но явно не вся история.

Например, оба значения "ascii" и "us-ascii" перечислены там как псевдонимы "iso-8859-1", однако, работая с моим языковым стандартом, установленным в США, они действуют как 7-битный MIME-тип ASCII. Им почти придется это делать, так как в любом случае больше ничего не предусмотрено для запроса 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 запишет спецификацию, и, конечно, эти расширенные (не ASCII) символы кодируются многобайтовыми кодами.

0 голосов
/ 12 августа 2011

Почему вы не можете просто сделать что-то вроде следующего? Это работает нормально для меня:

    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
...