2016-11-02 2 views
3

Beispiel:Welche Zeichencodierung verwenden die integrierten VBA-Dateioperationen?

Open "C:\...\someFile.txt" For Output As #1 
Print #1, someString 
Close #1 

Wenn somestring Nicht-ASCII-Zeichen enthält, wie werden sie verschlüsselt? (UTF-8, Latin-1, einige Codepage auf den Lokalisierungs-Windows-abhängig, ...)

Auf meinem System der Code über scheint Windows 1252 zu verwenden, aber da weder die Dokumentation des Open statement noch die Dokumentation der Print # statement Erwähnung Zeichenfolge Codierungen, kann ich nicht sicher sein, ob dies einige integrierte Standard oder einige Systemeinstellung ist, und ich bin auf der Suche nach einer Autorisierungsantwort.


Hinweis: Vielen Dank an alle darauf hindeutet, Alternativen, wie Dateien mit bestimmten Codierungen erstellen (ADODB.Stream, Scripting.FileSystemObject, etc.) - sie werden geschätzt. Bei dieser Frage geht es jedoch darum, das genaue Verhalten von Legacy-Code zu verstehen. Daher interessiert mich nur das Verhalten des oben zitierten Codes.

+0

Konnte [diese Antwort] (http://stackoverflow.com/questions/7269399/declarging-a-unicode-string-in-vba-in-excel) Ihnen helfen? – dee

+0

Die Standardcodierung ist Blackbox für mich. Sie sollten einen 'ADODB.stream' verwenden, damit Sie den' Zeichensatz' auswählen können. Siehe [this] (http://stackoverflow.com/questions/15906280/need-to-convert-text-files-to-unicode-from-utf8-in-vbscript) und [das] (http: // stackoverflow. com/questions/2524703/save-text-file-utf-8-encoded-with-vba) –

+0

Um eine Unicode-Datei zu erstellen, verwenden Sie die 'Scripting.FileSystemObject' Methoden: https://msdn.microsoft.com/de -us/library/5t9b5c0c% 28v = vs.84% 29.aspx – Andre

Antwort

5

Testen zeigt an, dass der Befehl VBA Print Unicode-Zeichenfolgen in den Einzelbyte-Zeichensatz der Codepage für das aktuelle Windows-Systemgebietsschema "Sprache für Nicht-Unicode-Programme" konvertiert. Dies kann mit dem folgenden Code dargestellt werden, die das griechische Wort zu schreiben versucht Ώπα:

Option Compare Database 
Option Explicit 

Sub GreekTest() 
    Dim someString As String 
    someString = ChrW(&H38F) & ChrW(&H3C0) & ChrW(&H3B1) 
    Open "C:\Users\Gord\Desktop\someFile.txt" For Output As #1 
    Print #1, someString 
    Close #1 
End Sub 

Wenn mit Windows ausgeführt wird für US-Englisch auf das Standardgebietsschema festgelegt, die resultierende Datei enthält den Bytes

3F 70 61 

entsprechen den Windows-1252-Zeichen ?pa. Windows-1252 ist der Zeichensatz, der am häufigsten (aber fälschlicherweise) als "ANSI" bezeichnet wird.

Doch nach der Windows- "non-Unicode" Lokalisierungs-Einstellungen auf Griechisch (Griechenland) Ändern

Greek.png

die gleiche VBA-Code schreibt eine Datei, die die Bytes

BF F0 E1 

enthält, die entsprechen zu den Windows-1253 (griechischen) Zeichen Ώπα.

+1

"Windows-1252 ist ... als ANSI"; liest, als wäre es die einzige Zeichencodierung, die als "ANSI" bezeichnet wird. Tatsächlich kann jede Zeichencodierung, die als "Sprache für Nicht-Unicode-Programme" eingestellt werden kann, als "eine" ANSI-Codierung und die aktuelle für den Thread als "die" ANSI-Codierung bezeichnet werden. –

+1

@TomBlodget - Technisch korrekt, aber leider sprechen viele englischsprachige Windows-Benutzer "ANSI" mit "Windows-1252" gleich. Da "ANSI" ein vager und falscher Name ist, ist es wahrscheinlich am besten, es ganz zu vermeiden, anstatt zu versuchen, einen weniger falschen Weg zu finden, es zu benutzen. (Es gibt eine gute Diskussion [hier] (http://stackoverflow.com/q/701882/2144390).) –

+0

Es scheint sinnlos, etwas gut bekannt zu testen. VB6 wurde für die Betriebssysteme ANSI Windows 9.x entwickelt. Daher führt es nur ANSI bei der Interaktion mit dem Betriebssystem. COM ist Unicode, also tut es Unicode, wenn es COM tut. Es macht intern Unicode. ABER ALLE API-ANRUFE SIND ANSI. Dies ist allgemein bekannt. –