Problem mit ReadString in UTF-16-Datei

Anfängerfragen zum Programmieren mit PureBasic.
Tanaghra
Beiträge: 28
Registriert: 13.05.2017 01:44

Problem mit ReadString in UTF-16-Datei

Beitrag 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
Windows 7 x64; geposteter Kode bezieht sich (sofern nicht anders angegeben) immer auf das aktuellste PureBasic 64-Bit

Erst wenn man es seiner Schwiegermutter erklären kann, hat man es verstanden.
As gsündeste is oiwei guad essn und dringa und ned grang wern.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Problem mit ReadString in UTF-16-Datei

Beitrag von Josh »

Hast du es schon mal mit einem ReadStringFormat() probiert?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8398
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 20.10
NVIDIA Quadro P2200
Wohnort: Saarbrücken
Kontaktdaten:

Re: Problem mit ReadString in UTF-16-Datei

Beitrag 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.
Bild
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Problem mit ReadString in UTF-16-Datei

Beitrag 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.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Tanaghra
Beiträge: 28
Registriert: 13.05.2017 01:44

Re: Problem mit ReadString in UTF-16-Datei

Beitrag 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
Windows 7 x64; geposteter Kode bezieht sich (sofern nicht anders angegeben) immer auf das aktuellste PureBasic 64-Bit

Erst wenn man es seiner Schwiegermutter erklären kann, hat man es verstanden.
As gsündeste is oiwei guad essn und dringa und ned grang wern.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8398
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 20.10
NVIDIA Quadro P2200
Wohnort: Saarbrücken
Kontaktdaten:

Re: Problem mit ReadString in UTF-16-Datei

Beitrag von NicTheQuick »

Bild
Antworten