Hmm..
hRb hat folgendes geschrieben : |
2. Der Typ String bei XE ist m.W. ja UTF8-Zeichensatz und belegt nur dann 2 Byte, wenn die Zeichen den Ascii-zeichenraum 0..128 überschreiten (darunter nur 1 Byte).
|
Wie kommst Du denn darauf?
UniCode ist immer 2 Bytes je Char (bestimmte Codepages ziehen 2 UniCode Chars zu einer CodeUnit zusammen) und sollte in XE ein UTF-16 sein!
hRb hat folgendes geschrieben : |
3. Mit der Anweisung
Delphi-Quelltext
lese ich ja genau die Länge der Datei in Byte und mit
Read(fStream[1],len);
exakt die Datei ein.
Nun liegt es doch an meiner Verarbeitung festzustellen ob ein Zeichen zwei Byte belegt. Demzufolge sollte ich auch auf jedes einzelne Byte im String zugreifen können. Oder liege ich da falsch? bzw. wozu ist dann die Read-Methode in XE-Compilern noch da?
|
Richtig! Du liest BYTES ein, keine Chars!
Wenn deine Datei Ansicodiert ist, dann stehen da immer 1 Byte = 1 Char drinnen.
Wenn Du nun diese Bytes (und was anderes list du mit Read nicht ein) in einen Unicode String einliest, dann werden somit 2 Bytes (= 2 AnsiChars) in ein Unicode Char gelesen. Das passiert auch im Windows-Editor, wenn dieser Chinesische Zeichen anzeigt
Wenn Du mit String Index arbeiten möchtest, musst Du vorher prüfen (Stichwort BOM) ob es eine Ansi oder Unicode Datei ist und dann entsprechend in ein Ansistring oder Unicodestring einlesen!
Sprich bei ASCII/ANSI-Dateien mit AnsiString einlesen und bei Unicode-Dateien mit string (= UnicodeString unter XE).
Mit deinem FStream[x] greifst Du nicht auf das x-te BYTE sondern auf das x-te CHAR zu. somit bei Ansistring immer auf das Byte, bei UniCode immer auf 2/4 Bytes!
Somit ist die Methode nicht wirklich brauchbar zum 'nachträglichen' aufdröseln..