AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Unicode: Wie kann ich das BOM von einem String entfernen.
Thema durchsuchen
Ansicht
Themen-Optionen

Unicode: Wie kann ich das BOM von einem String entfernen.

Ein Thema von rakekniven · begonnen am 12. Feb 2010 · letzter Beitrag vom 12. Feb 2010
Antwort Antwort
rakekniven

Registriert seit: 4. Apr 2008
Ort: Franken
82 Beiträge
 
Delphi XE5 Professional
 
#1

Unicode: Wie kann ich das BOM von einem String entfernen.

  Alt 12. Feb 2010, 14:48
Ich lese eine Textdatei via AssignFile/readln ein. (D2010)

Falls das erste Zeichen ein ";", soll die Zeile ignoriert werden.
Alles Konstrukt von D7:
Delphi-Quellcode:
if Length(S2) > 0 then
 DoLine := Trim(String(S2))[1] <> ';'       // Kommentarzeilen beginnen mit einem ';'
else
 DoLine := FALSE;
Die Datei liegt in UTF8 mit BOM vor.
Die Stringvariable ist vom Typ "RawByteString".

Die erste Zeile hat den Inhalt
'; This file was auto generated by Langdiff Version 2.0.61 on 12.02.2010 09:28:12' Die ersten drei Zeichen sind das BOM.

Wie kann ich den String nun davon säubern, damit ich wieder auf das erste Zeichen prüfen kann?

Ein Trim hilft nicht, auch nicht eine Umwandlung in String (casting) oder via UTF8toString.

Hoffe ich konnte mein Vorhaben einigermassen beschreiben.

Gruß

<edit>
Nach dem Schreiben des Postings ist mir gerade noch eine Idee gekommen:
Mit "WideStrUtils.HasUTF8BOM" prüfen ob das BOM da ist, wenn ja dann die ersten drei Zeichen löschen.
Kling das gut?
</edit>
Frag google
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#2

Re: Unicode: Wie kann ich das BOM von einem String entfernen

  Alt 12. Feb 2010, 15:07
Die Datei unbedingt mit AnsiString auslesen.

Selbst bei Verwendung von String/WideString/UnicodeString wird nur ANSI ausgelesen,
aber die interne Unicodeumwandlung zerstört womöglich wichtige Zeichen.

So, nun zurück zum Thema:
Wie löscht man ungewünschte Zeichen?
> Delete oder Copy

Delphi-Quellcode:
ReadLn(F, A);
S := UTF8toString(A);
Delete(S, 1, 1);

ReadLn(F, A);
Delete(A, 1, 3);
S := UTF8toString(A);
Aber nimm lieber eine TStringList, denn diese beachtet das UTF-8-BOM, entfernt es und dekodiert auch gleich die Datei.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
rakekniven

Registriert seit: 4. Apr 2008
Ort: Franken
82 Beiträge
 
Delphi XE5 Professional
 
#3

Re: Unicode: Wie kann ich das BOM von einem String entfernen

  Alt 12. Feb 2010, 15:26
Ich habe mit dem Mechanismus readln und Datentyp "RawByteString" schon einige Anwendungen angepasst und dadurch die Mehrsprachigkeit (28 Sprachen inkl. asiatischen) eingebaut.
Das klappte klaglos.

Was möchtest Du mir mit den beiden Codeschnipseln sagen?

Gruß
Frag google
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#4

Re: Unicode: Wie kann ich das BOM von einem String entfernen

  Alt 12. Feb 2010, 15:50
OK, RawByteString ist intern auch nur ein spezieller AnsiString.

Aber vorallem vor den Unicode-Strings, im Zusammenhang mit diesen alten Pascal-Funktionen und einer anderen Codierung innerhalb der Datei, mußt du aufpassen.

Zitat:
Was möchtest Du mir mit den beiden Codeschnipseln sagen?
Beide entfernen ein UTF-8-BOM aus einem AnsiString/RawByteString ?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Unicode: Wie kann ich das BOM von einem String entfernen

  Alt 12. Feb 2010, 15:55
Zitat:
Die UTF-8-Kodierung des BOM besteht aus der Bytesequenz EF BB BF, die in nicht UTF-8-fähigen Texteditoren und Browsern meist als ISO-8859-1-Zeichen  erscheinen. Bei UTF-8 stellt sich das Problem der Byte-Reihenfolge zwar nicht, doch ein BOM am String- oder Dateianfang ist erlaubt, um die Verwendung von UTF-8 als Kodierung zu kennzeichnen. Eine sichere Unterscheidung zwischen UTF-8 und den ISO-8859-Zeichensätzen ist dadurch zwar nicht gewährleistet, da in den 8-Bit-Zeichensätzen alle Bytesequenzen erlaubt sind, auch die UTF-8-Kodierung des BOM; wenn aber die Alternative speziell UTF-8 oder ISO 8859-1 ist, ist die pragmatische Annahme, dass die Zeichenfolge  nicht gemeint ist, durchaus üblich.
aus Wikipedia

Wenn ich das richtig verstanden habe dann sollte so alles erledigt sein:
Delphi-Quellcode:
if length(mystring)>2 and
   mystring[1]=#$EF and
   mystring[2]=#$BB and
   mystring[3]=#$BF then
  delete(mystring,1,3);
if length(mystring)>0 ....
Gruß
k-h
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
rakekniven

Registriert seit: 4. Apr 2008
Ort: Franken
82 Beiträge
 
Delphi XE5 Professional
 
#6

Re: Unicode: Wie kann ich das BOM von einem String entfernen

  Alt 12. Feb 2010, 16:00
Danke für die Tipps
Frag google
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#7

Re: Unicode: Wie kann ich das BOM von einem String entfernen

  Alt 12. Feb 2010, 16:06
Wenn man sich mal bewußt ist, was diese 3 Byte wirklich bedeuten, dann kommt man gekürzt auf dieses:
Delphi-Quellcode:
ReadLn(myfile, a);
s := UTF8Decode(a);
if (s <> '') and (s[1] = #$FEFF) then delete(s, 1, 1);
So könnte man auch noch eine Prüfung einbauen, welche die Daten gleich noch mit prüft
Delphi-Quellcode:
ReadLn(myfile, a);
s := UTF8Decode(a);
if (s = '') or (a <> '') then s := a
else if (s <> '') and (s[1] = #$FEFF) then delete(s, 1, 1);
Hier würde dann die erste Zeile einer "Ansi"-Datei oder einer UTF-8-kodierten Datei eingelesen.
(selbst UTF-8 ohne BOM würde halbwegs sicher erkannt)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
rakekniven

Registriert seit: 4. Apr 2008
Ort: Franken
82 Beiträge
 
Delphi XE5 Professional
 
#8

Re: Unicode: Wie kann ich das BOM von einem String entfernen

  Alt 12. Feb 2010, 16:16
Mache es nun so:

Delphi-Quellcode:
ReadLn(myfile, a);
if WideStrUtils.HasUTF8BOM(a) then
begin
 delete(a, 1, 1);
 s := UTF8toString(a)
end
else
 s := a;
"s" verwende ich dann als String in der Anwendung. Bei mir sind es Sprachtexte.

Die Aktion wird nur bei der ersten Zeile durchgeführt (Boolscher Merker) > Performance
Frag google
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#9

Re: Unicode: Wie kann ich das BOM von einem String entfernen

  Alt 12. Feb 2010, 16:22
Zitat von rakekniven:
Mache es nun so:
das delete(a, 1, 1) stimmt definitiv nicht, denn dieses BOM ist 3 Byte groß.

Delphi-Quellcode:
uses WideStrUtils;

ReadLn(myfile, a);
if HasUTF8BOM(a) then
begin
  delete(a, 1, Length(sUTF8BOMString)); // oder eben delete(a, 1, 3);
  s := UTF8toString(a);
end
else
  s := a;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
rakekniven

Registriert seit: 4. Apr 2008
Ort: Franken
82 Beiträge
 
Delphi XE5 Professional
 
#10

Re: Unicode: Wie kann ich das BOM von einem String entfernen

  Alt 12. Feb 2010, 16:29
War ein Typo

Jetzt haben wir ne schöne Funktion, welche sicherlich auch noch andere gut gebrauchen können.

Ich war gestern auf einem Vortrag zu l10n/i18n. Da wird von nix anderem als Unicode (in allen Spielarten) geredet. Die armen Embedded-Entwickler haben es da nicht so leicht.

Gruß
Frag google
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz