Unicode Datei mit Input lesen und mit Print schreiben

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

pauliv_de
*
Beiträge: 17
Registriert: Fr, 31.08.2007 08:56

Unicode Datei mit Input lesen und mit Print schreiben

Beitrag von pauliv_de »

Ich muss eine Textdatei verarbeiten, die im Unicode vorliegt.
Wenn ich die Eingabedaten mit input einlese und mit print wieder ausgebe, dann werden 2 Fragezeichen an den Anfang der Ausgabedatei gestellt. (die Eingabedatei enthält dort x'FF FE')
Die Ausgabedatei ist dann auch nicht mehr im Unicode.

der Inhalt der Eingabedatei:

Code: Alles auswählen

Zeile 1 der TextEingabeDatei in Unicode 
Zeile 2 der TextEingabeDatei in Unicode
Programmausschnitt:

Code: Alles auswählen

for i = 1 to 2
   input #iDatenkanalIn, sInhalt
   print #iDatenkanalOut, sInhalt
next
der Inhalt der Ausgabedatei:

Code: Alles auswählen

??Zeile 1 der TextEingabeDatei in Unicode 
Zeile 2 der TextEingabeDatei in Unicode 
Ich würde mich freuen, wenn mir jemand helfen könnte, die Ausgabedatei auch im korrekten Unicode (ohne die Fragezeichen) zu bekommen.
Danke im Voraus.
Paul
NIiLs
*
Beiträge: 18
Registriert: Mo, 02.11.2009 12:34

Re: Unicode Datei mit Input lesen und mit Print schreiben

Beitrag von NIiLs »

Das ginge z.B.: wie folgt:

Code: Alles auswählen

Sub Main
  Dim sInName, sOutName As String
  Dim x, i, iSz As Integer
  
  sInName = "C:\tmp\in.txt"
  sOutName = "C:\tmp\in.txt"
  
  iNum = 1
  oNum = 2 
  iSz = FileLen(sInName)
  Open sOutName For Binary Access Write As #oNum Len=1
  Open sInName For Binary Access Read As #iNum Len=1
  for i = 0 to iSz-1
    Get #iNum,i+1,x
    Put #oNum,i+1,x
  Next i

  Close #iNum 
  Close #oNum
End Sub
Unicode benötig immer 2 Zeichen (oder 4) für einen dargestellten Buchstaben. Da solche Sequenzen in verschiedener Reihenfolge gespeichert werden können (Little/Big Endian) kann es (muss aber nicht) am Dateianfang eine BOM (Byte Order Mark) geben. Damit kann beim Lesen eindeutig festgestellt werden was vorliegt (0xFF, 0xFE = Little Endian UCS-2). Jedes Zeichen besteht dann auch aus 2 Byte (z.B.: 0x48 0x00 = "H").

Wenn Du also die einzelnen Zeilen benötigst musst Du die Daten (x) selber untersuchen (0x0A 0x00 ist z.B. ein Zeilen Ende). Aber Achtung(!) nur die normalen ASCII-Zeichen lassen sich dann in BASIC korrekt darstellen, Sonderzeichen ergeben unweigerlich einen Fehler und müssen geignet abgefangen werden (was nicht immer geht!!). Für weiterführendes Interesse einfach mal "Zeichensatz" auf WikiPedia eingeben ....
Antworten