Seite 1 von 1

Problem mit ReadString in UTF-16-Datei

Verfasst: 19.04.2018 02:22
von Tanaghra
Hallo,

angenommen, ich habe eine Unicode-Textdatei (UTF-16) folgenden Inhalts:
*
Text 1
*
Text 2
*
Text 3
und will die Anzahl der in dieser Datei vorkommenden '*' zählen, mit folgendem kleinen Programm:

Code: Alles auswählen

Define Zk.s, Za
ReadFile(1, "D:\Texte\Asteriskus.txt", #PB_Unicode)
While Not Eof(1)
  Zk=ReadString(1)
  If Zk="*"
    Za+1
  EndIf
Wend
Debug Za
CloseFile(1)
(D:\Texte\Asteriskus.txt ist die Datei von oben). Nun sollte man meinen, daß Debug Za '3' ausspuckt, da ja drei Asterisken in der Datei oben enthalten sind. Das ist aber nicht der Fall, sondern es wird '2' ausgegeben.
Dieser Fehler tritt nicht auf, wenn man die Textdatei ins Format ANSI oder UTF-8 konvertiert und das Flag im ReadFile-Befehl in #PB_Ascii bzw. #PB_UTF8 ändert. Irgendwie scheint PureBasic Probleme mit UTF-16-Dateien zu haben. Oder hat jemand eine Erklärung, warum der erste Asteriskus dort übersprungen wird?

Vielen Dank

Re: Problem mit ReadString in UTF-16-Datei

Verfasst: 19.04.2018 06:28
von Josh
Hast du es schon mal mit einem ReadStringFormat() probiert?

Re: Problem mit ReadString in UTF-16-Datei

Verfasst: 19.04.2018 07:49
von NicTheQuick
Ist da vielleicht noch ein BOM am Anfang, sodass die erste Zeile ignoriert wird? Lass dir doch mal ausgeben, was ReadString eingelesen hat.

Re: Problem mit ReadString in UTF-16-Datei

Verfasst: 19.04.2018 10:20
von mhs
UTF-16 hat im Gegensatz zu UTF-8 grundsätzlich immer ein BOM am Anfang der Datei stehen. D.h. Josh und NicTheQuick haben recht, das BOM wird zusammen in der Zeile eingelesen.

Ein einfaches ReadStringFormat(1) vor der Schleife sollte für Abhilfe sorgen.

Re: Problem mit ReadString in UTF-16-Datei

Verfasst: 20.04.2018 09:23
von Tanaghra
Hallo,

danke für den Hinweis mit ReadStringFormat, das löst das Problem. Trotzdem ist es merkwürdig, daß die erste Zuweisung zwar korrekt erfolgt (Za ist gleich "*"), die erste Identitätsprüfung aber False ergibt, d.h., es wird nicht in den If-Block verzweigt.

Was ist mit 'Am Anfang der Datei steht ein BOM' eigentlich konkret gemeint? Ist das ein bestimmter Zahlenwert, der am Anfang steht?

Vielen Dank

Re: Problem mit ReadString in UTF-16-Datei

Verfasst: 20.04.2018 09:56
von NicTheQuick