evinben
Goto Top

Pfade mit kyrillischen Zechen in eine Text-Datei ausgeben und in VBS einlesen und verarbeiten.

Hallo,

nehmen wir in dem nachfolgenden Beispiel die folgenden beiden Dateien an - 1x auf Deutsch und 1x übersetzt auf Russisch:
D:\Persönliche Einstellungen\Fräsbahn.txt
D:\Личные настройки\траектория.txt
Es werden Dateien, die kyrillische Buchstaben in dem Namen enthalten, zur Weiterverarbeitung auf eine Batch-Datei gezogen und losgelassen (empfangene Argumente %* wären dann: "траектория.txt" "Fräsbahn.txt"). Im Batch werden die vollständigen Pfade als Argumente in Variable gesetzt und anschließend jeder Pfad in einer txt-Datei auf separater Zeile ausgegeben (ganz klassisch im ANSI-Textformat). Wenn nun diese Text-Datei geöffnet und betrachtet wird, sind dort die kyrillischen Buchstaben dann nicht mehr 1:1 zu sehen

òðàåêòîðèÿ.txt
Frasbahn.txt

dennoch können diese Pfade vom Batch problemlos weiterverarbeitet werden – z. B. mit den aus der Text-Datei zurückeingelesenen Pfade die beiden Dateien löschen, verschieben und sonstiges…
Anders sieht es leider aus, wenn die Pfade aus der gleichen Text-Datei von einem VB-Script eingelesen und weiterverarbeitet werden: das VB-Script zeigt die eingelesenen Pfade in einem MsgBox zwar so an, wie diese in der Text-Datei zu lesen sind (òðàåêòîðèÿ.txt), kann diese dennoch nicht korrekt weiter verarbeiten - löschen, verschieben u. s. ist nicht möglich.
(Es wird kein Fehler bei der Skript-Ausführung angezeigt.)

Anbei ist ein kleiner Kode-Abschnitt aus der Batch-Datei, auf welche die obigen problematischen Dateien gezogen und losgelassen werden:
set AllFiles =%*
chcp 1251
for %%d in (%AllFiles%) do echo %%~d>>FullFileName.txt
Es werden die Pfade in der Datei FullFileName.txt ausgegeben und dort sehen sie dann wie folgt aus:

"D:\Ëè÷íûå íàñòðîéêè\òðàåêòîðèÿ.txt"
"D:\Personliche Einstellungen\Frasbahn.txt"


Die Text-Datei in Unicode abzuspeichern schafft uns hier leider keine Abhilfe - das VB-Skript zeigt die eingelesenen Pfade in einem MsgBox zwar mit anderen Zeichen an, wie diese in der Text-Datei zu sehen sind, kann sie auch hier nicht weiter verarbeiten - löschen, verschieben u. s. ist nicht möglich.

So wie ihr es bereits bemerkt habt, entstehen mit der obigen Methode gleich zwei Schwierigkeiten:
1. Die Codepage muss für jede Sprache umgestellt werden – d. h. in unserem Beispiel, dass schon vor der Ausgabe jedes Dateipfades der richtigen Codepage automatisch erkannt und geschaltet werden muss.
2. Die Pfade werden von dem VB-Skript nicht korrekt verarbeitet.

Auf einer Windows 7 Umgebung mit russischer Ländereinstellung funktioniert das Vorhaben problemlos (wenn unter Systemsteuerung\Zeit, Sprache und Region > Sprache für Unicode- inkompatible Programme das Gebietschema auf Russisch geändert ist).
Das Umstellen auf Russisch ist natürlich keine Lösung – jede Umgebung muss natürlich weiterhin unverändert bleiben (abgesehen davon, dass beim Umschalten jeweils Neustarten erforderlich ist).
Wenn die Verarbeitung eines mit deutschen und russischen Zeichen gemischten Pfades, aufgrund der Beschränkungen der cmd.exe-Architektur, nicht möglich ist (z. B. ein klassischer Beispiel D:\Persönliche Einstellungen\траектория.txt), müssen natürlich alternativere Varianten her, wobei mir persönlich Batch echt lieber wäre.

Über eure Lösungsvorschläge wäre ich euch sehr dankbar!

Gruß
evinben

Content-Key: 188875

Url: https://administrator.de/contentid/188875

Printed on: May 7, 2024 at 20:05 o'clock

Member: rubberman
rubberman Jul 31, 2012 at 16:59:15 (UTC)
Goto Top
Hallo evinben!

Ich muss mich auch erst mal mit der Materie beschäftigen, nur soviel vorab:
Mit Batch bist du ziemlich weit von einer möglichen Lösung entfernt. Batch hat einen besonders tollen Unicode Support face-sad Die CMD ist durchaus in der Lage Unicodezeichen aus einer Pfadangabe in eine Variable zu packen. Nun wirds aber auch schon kritisch. Das Schreiben dieser Pfade in eine Datei erfolgt durch ECHO Umleitung. Damit hast du gleich 2 Probleme auf dem Hals.
- Erstens musst du die 16 Bit Breite eines Characters in Unicode auf 8 Bit reduzieren (... was eigentlich nur funktionieren kann, wenn die höchsten 8 Bit 0 sind. Ich frage mich gerade wieso das trotzdem funktioniert ...). Die FOR Schleife scheint das irgendwie zu bewerkstelligen.
- Zweitens musst du einen Zeichensatz wählen, der das dann auch noch mit der eingestellten Schriftart in anzeigbare Zeichen bringt. Mit "ganz klassisch im ANSI-Textformat" magst du zwar recht haben, was den rohen Inhalt der Datei anbetrifft, ob es aber für jedes der kyrillischen Zeichen solch eine verdrehte ANSI Entsprechung gibt, wage ich mal vorsichtig zu bezweifeln.

Grüße
rubberman
Member: rubberman
rubberman Jul 31, 2012 updated at 21:18:47 (UTC)
Goto Top
Hallo nochmal,

also ... mögliche Lösung mit Batch wäre eine umständliche Konvertierung zu Unicode.
*.bat
@echo off &setlocal

:: ACP
>nul chcp 1252

:: Byte Order Mark für UTF-16 LE [Nur einmal an den Anfang der Textdatei setzen!]
if not exist "FullFileName.txt" (  
  (set /p =ÿþ) <nul >"FullFileName.txt"  
)

:: cmd /u für Unicode
for %%d in (%*) do cmd /u /c "echo %%~d>>"FullFileName.txt""  

:: zurück zur OEMCP
>nul chcp 850

:: weiterer Code

Im VBScript dann als Unicode Datei öffnen
*.vbs
Const ForReading = 1
Const NoCreate = False
Const AsUnicode = -1

Dim oFSO, oFile

Set oFSO = CreateObject("Scripting.FileSystemObject")  
Set oFile = oFSO.OpenTextFile("FullFileName.txt",ForReading , NoCreate, AsUnicode)  
WScript.Echo oFile.ReadAll
oFile.Close

Grüße
rubberman
Member: evinben
evinben Jul 31, 2012 updated at 21:56:22 (UTC)
Goto Top
Hallo rubbermann,

danke für deine Antwort!
So wie ich sehe, hast du dich nicht zum ersten Mal mit diesem Thema befasst und hast bereits tolle Vorschläge gemacht:
Eine mit encoding UTF-8 gespeicherte Datei neu speichern mit encoding ANSI

Und noch etwas möchte ich zu deiner folgenden Aussage hinzufügen:
Mit "ganz klassisch im ANSI-Textformat" magst du zwar recht haben, was den rohen Inhalt der Datei anbetrifft, ob es aber für jedes der kyrillischen Zeichen solch eine verdrehte ANSI Entsprechung gibt, wage ich mal vorsichtig zu bezweifeln.
Wenn wir auf der Website hier nachschauen http://www.5goldig.de/Russische_Tastatur/kyrillisch-umwandeln.html, dann stellen wir fest, dass eine Konvertierung von Kyrillisch Windows 1251 in UTF-8 die Zeichen ohne jegliche Informationsverluste wieder im Originalzustand zurückstellt. Also es ist eine Umwandlung in beiden Richtungen möglich.
Am Ende des Betrages, in welchem du deine Vorschläge geäußerst hast (siehe link oben), wollte der Benutzer NBTKetchup@ eine Konvertierung von ANSI in UTF-8, die leider immer noch nicht vollendet worden ist.
Eventuell schafft so eine Konvertierung in UTF-8 für VB-Script (zur korrekten Weiterverarbeitung der Pfade – also Dateien per VB-Script verschieben, löschen, kopieren usw…) eine Abhilfe? Bzw. kann VBS mit Unicode gut umgehen?

Gruß
evinben
Member: evinben
evinben Jul 31, 2012 at 23:19:41 (UTC)
Goto Top
Hallo rubbermann,

zu dem
also ... mögliche Lösung mit Batch wäre eine umständliche Konvertierung zu Unicode.
*.bat
und zu dem
Im VBScript dann als Unicode Datei öffnen
*.vbs

sage ich laut:

back-to-topGENIAL!


Auch die raffinierte Lösung mit
(set /p =ÿþ) <nul >"FullFileName.txt"   
finde ich einfach bewundernswert! Ansonsten ist der Vorschau im Windows-Explorer nicht korrekt und vermutlich auch andere nicht hervor schaubare Kinderkrankheiten.

Ich frage mich nur, wie du dir das alles beigebracht hast und was da für ein Know-how in dir stecken muss... Was ist das überhaupt "ÿþ" und warum sollte man es wissen face-wink.

Ich hoffe ab nun keine sonderlichen Probleme mehr in der Zukunft mit den gemischten Zeichen in den Pfaden zu haben und generell bei der Verarbeitung von Zechenketen im Allgemeinen.

Dies hat mir bisher immer Probleme bereitet und es hat sich die Überwindung - dankbar deiner großartigen Unterstützung - echt gelohnt!

Projekt abgeschlossen.

Schönen Gruß
evinben
Member: rubberman
rubberman Aug 01, 2012 at 18:54:16 (UTC)
Goto Top
Hallo evinben!

Erst mal danke für die Blumen face-smile

Zitat von @evinben:
Am Ende des Betrages, in welchem du deine Vorschläge geäußerst hast (siehe link oben), wollte der Benutzer NBTKetchup@ eine Konvertierung von ANSI in UTF-8, die leider immer noch nicht vollendet worden ist.
Habe ich leider nie bemerkt, ist aber nun beantwortet. Vielleicht stolpert ja noch mal jemand beim Suchen drüber ...

Zitat von @evinben:
... dann stellen wir fest, dass eine Konvertierung von Kyrillisch Windows 1251 in UTF-8 die Zeichen ohne jegliche Informationsverluste wieder im Originalzustand zurückstellt.
Das möchte ich aber nicht per Batch versuchen. Falls du mal viel Langeweile hast, kannst du dich an Codepage 65001 versuchen. Viel Spaß dabei face-wink

Zitat von @evinben:
kann VBS mit Unicode gut umgehen?
VBS selbst nur wenig besser als Batch. Wie du siehst waren auch in dem von dir verlinkten Beitrag Eigenschaften und Methoden von ActiveX Objekten nötig. Aber wenigstens ist die Referenzierung solcher Objekte in einem VBScript möglich ...

Zitat von @evinben:
Ich frage mich nur, wie du dir das alles beigebracht hast und was da für ein Know-how in dir stecken muss... Was ist das überhaupt "ÿþ" und warum sollte man es wissen face-wink.
Das kommt mit der Zeit. Wenn man ein Problem mit unterschiedlichen Zeichensätzen hat, beschäftigt man sich eben mal 'ne Stunde damit und kommt somit unweigerlich auch mit 0xFF 0xFE als BOM für UTF-16 Little Endian in Berührung. Es ist nur noch ein kleiner Step bis zur Umsetzung per Batch ...

Grüße
rubberman
Member: evinben
evinben Aug 02, 2012 at 04:43:44 (UTC)
Goto Top
Hallo rubberman!

Danke für die kleine Aufklärung in der Zeichen-Wellt.
Ich habe mir in den letzten Tagen einiges über Unicode – gigantische Fülle an Information - und generell über die Codepages im Allgemeinen durchgelesen und ehrlich es ist für mich mehr erschreckender, als hilfreicher gewesen, da alleine in dieser Richtung sehr viel Wissen und Einarbeitung erforderlich ist. Ein - zwei Tage schnell - schnell wäre hier nichts…

Schön, dass es euch hier gibt – sehr gepflegter Forum!

Gruß
evinben