Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 271
Erhaltene Danke: 12



BeitragVerfasst: So 10.09.17 21:32 
Ich möchte mein (altes D7) Programm umstellen auf Unicode, d.h. beim Öffnen/Speichern auch verschiedene Codierungen verarbeiten. In der XE-Pascal-Hilfe lese ich, dass TEncoding des Compilers folgende Parameter kennt (leider ohne Angabe des BOM=Byte-Order-Mark):
ANSI,...........System.SysUtils.TMBCSEncoding
ASCII,...................................TMBCSEncoding
UTF-8,...................................TUTF8Encoding
UTF-7....................................TUTF7Encoding
UTF-16 (Unicode),.................TUnicodeEncoding
Big-endian UTF-16,Big-endian Unicode,....TBigEndianUnicodeEncoding

In Wikipedia lese ich folgende BOM:
UTF-8....................................EF BB BF
UTF-7....................................38 39 2B 2F
UTF-16(BE)............................FE FF
UTF-16(LE)............................FF FE
UTF-32(BE)............................00 00 FE FF
UTF-32(LE)............................FF FE 00 00
und weitere, die der Compiler nicht automisch encodiert

Wenn ich nun den BOM auswerte, ist meine Frage welcher "Wikipedia" -BOM der Compiler-Encoding zuzuordnen sind. Ich sehe:
1. UTF-8 und UTF-7 sind eindeutig
2. unklar ist die UTF-16-Bit Zuordnung
3. UTF-32 ist im Compiler offenbar nicht enthalten
4. da ANSI und ASCII kein BOM enthält, ist für mich unklar, wie beim Dateiöffnen erkannt werden kann, um welchen Dateityp es sich handelt.
5. in Beispielen finde ich für encoding zusätzlich: Default und Nil. Welche Codierung kommt bei Default bzw Nil zum tragen?

Kann hier jemand Klarheit schaffen? Worin unterscheiden sich BE und LE?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10182
Erhaltene Danke: 1255

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 10.09.17 23:12 
Moin!

user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Kann hier jemand Klarheit schaffen?
Bei den Encodings in neuen Delphi-Versionen kann ich dir nicht helfen, sorry. :nixweiss:

user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Worin unterscheiden sich BE und LE?
Aber das kann ich dir erklären: BE steht für "big-endian" und LE für "little-endian". Hier findest du mehr :les:, das muss ich ja hier nicht nochmal aufbeten. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 271
Erhaltene Danke: 12



BeitragVerfasst: Mo 11.09.17 21:38 
Ok, will Frage nochmals anders stellen. Mir ist bekannt:
BE schreibt die Zeichen vorwärts: 1, 2, 3, 4 (BOM= FE FF),
LE schreibt rückwärts: 4, 3, 2, 1 (BOM= FF FE).
Dies erkenne ich durch BOM-Auswertung.
Beim Programmieren kann ich als TEncoding aber nur Unicode (einheilich) einstellen:
BigEndian ist bei XE3-Compiler für 32-Bit vorgesehen.
Speichere ich ganz normalen fortlaufenden Text "abcdefg" und lese ihn mit encoding=Default wieder, dann sieht der Text so aus: a b c d e f g
Und nochmal: wie kann man denn ASCII und ANSI auseinander halten, wo es keinen BOM gibt?
doublecross
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 149
Erhaltene Danke: 27

Windows 7
C#; Visual Studio 2015
BeitragVerfasst: Di 12.09.17 17:16 
Hi,

user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Ich möchte mein (altes D7) Programm umstellen auf Unicode, d.h. beim Öffnen/Speichern auch verschiedene Codierungen verarbeiten.


user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Beim Programmieren kann ich als TEncoding aber nur Unicode (einheilich) einstellen


Ich habe tEncoding zwar auch noch nie verwendet (und bin auch nie bei einer XE Delphi Version angekommen) aber ich würde Vorschlagen, schreibe doch einfach mal eine Datei mit der Komponente und schaue dir den BOM danach im HexEditor an, dann weißt du was die Komponente schreibt.

Wenn du allerdings Unicodeformate allumfänglich öffnen können willst, musst du dir dann ohnehin eine andere Lösung einfallen lassen, wenn tEncoding nicht beide Varianten unterstützt.

user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Und nochmal: wie kann man denn ASCII und ANSI auseinander halten, wo es keinen BOM gibt?

Gar nicht. Wenn du eine Datei ohne BOM bekommst gehst du davon aus, dass es eine Datei ist, welche für die aktuell in deinem System konfigurierte Codepage gedacht ist. Alles andere ist nur Rätzelraten und Unicode ist das auch nicht mehr. Es sei denn, du möchtest noch Unicode Codierungen ohne BOM erraten, einige Editoren machen das ganz passabel.

Ich kenne deinen genauen Anwendungsfall jetzt nicht, aber meist ist es das wichtigste den Nutzer saubere Wege (unicode mit BOM) anzubieten. Dann kann man ihnen gegenüber auch argumentieren, das nur diese wirklich sicherstellen, dass auch jedes Zeichen so ankommt, wie er es haben möchte.

PS: In C# ist es so, dass wenn im Namen des Ebencodings nicht anderes behauptet wird eine LE Codierung bei UTF16/32 verwendet wird. Aber ob Delphi das ähnlich macht findest wie beschrieben am leichtesten per Experiment raus.