![]() |
Kodierung in UCS-2 Little Endian
Hallo zusammen,
wie die Überschrift sagt, habe ich Probleme mit dem kodieren einer Nachricht in "UCS-2 Little Endian". Leider kann die lesende Lasermaschine nur dieses Encoding einwandfrei verarbeiten. Wie kann ich Delphi am Besten dazu bringen, die Datei richtig zu kodieren? Folgenden Code habe ich geschrieben, aber er funktioniert leider bei einigen Zeichen nicht:
Delphi-Quellcode:
Am Anfang der XML Datei steht übrigends folgendes Encoding:
strStream := TStringStream.Create('', TEncoding.Unicode);
Code:
Danke für eure Hilfe!
<?xml version="1.0" encoding="utf-16"?>
|
AW: Kodierung in UCS-2 Little Endian
Am besten einen XML-Parser zum schreiben nehmen der UTF16 kann.
|
AW: Kodierung in UCS-2 Little Endian
Zitat:
![]() Das würde ich testen, aber auch mal den Hersteller fragen wie "utf-16" im Header zu "ucs-2 LE" passt, denn es gibt auch "ISO-10646-UCS-2" als XML encoding. |
AW: Kodierung in UCS-2 Little Endian
Zitat:
|
AW: Kodierung in UCS-2 Little Endian
Zitat:
Also ist eher die Frage, bei welchen Zeichen es nicht funktioniert und wie die Quelldaten erzeugt/generiert werden... |
AW: Kodierung in UCS-2 Little Endian
Zitat:
|
AW: Kodierung in UCS-2 Little Endian
Zitat:
|
AW: Kodierung in UCS-2 Little Endian
Ich glaube nicht das man im Bereich der erstellen dieser Daten in die Gefahr kommt Zeichen zu haben die in UTF-16 und UCS-2 anders codiert wären.
Unsere Anwendung lief problemlos auf einem UCS-2 System (Windows 2000) und läuft auch Problemlos auf UTF-16 Systemen (Windows XP und neuer) ohne eine einzige Quellcodezeile angepasst zu haben! |
AW: Kodierung in UCS-2 Little Endian
Habt ihr auch damals Daten als UCS-2 gespeichert und dann versucht als UTF-16 zu laden? :stupid:
|
AW: Kodierung in UCS-2 Little Endian
Zitat:
Die umgekehrte Richtung geht nicht (UTF-16 nach UCS-2 konvertieren). Für die Zeichencodierung stehen in Unicode insgesamt 1.111.998 Codepunkte zur Verfügung. Und 1.111.998 > 65.536. Wenn man mit der Lasermaschine zum Beispiel keine Emojis oder Mahongg-Zeichen ausgeben muss, Gl♫ckwunsch :) |
AW: Kodierung in UCS-2 Little Endian
Zitat:
Und deshalb wird das UCS-2 kein Problem darstellen da der Befehlsvorrat mit Sicherheit keinen ♫-Befehl kennt. |
AW: Kodierung in UCS-2 Little Endian
Zitat:
![]() edit: Auch bei ![]() |
AW: Kodierung in UCS-2 Little Endian
Zitat:
|
AW: Kodierung in UCS-2 Little Endian
Hallo zusammen,
erstmal danke für die vielen Antworten. Ich hoffe ich kann auch hier ein paar Fragen beantworten: 1. Wieviele Dateien lädt ein Laser pro Tag? Das ist unterschiedlich und kommt auf die Chargengröße an. Normalerweise wird 5 bis 10 mal pro Tag ein neues File geladen. 2. Bei welchen Zeichen funktioniert der Code nicht? Also er schafft es nicht einen "Line Feed character" richtig zu codieren. Der Laser bekommt das Zeichen
Code:
sollte aber
&xA;
Code:
bekommen. Das trat übrigends schon bei der ersten Datei auf ;)
Mein aktueller Stand ist, dass ich versuche mit einem TXMLDocument das ganze ans laufen zu bekommen. Leider gibt es bei LoadFromFile scheinbar keinen Parameter um das Encoding festzulegen... Geht das dann in diesem Fall automatisch? Danke! |
AW: Kodierung in UCS-2 Little Endian
Zitat:
Der XML-Standard schreibt die Möglichkeit vor Sonderzeichen auf mehrer Arten zu Codieren. Bei einem LF wäre das die oben aufgeführten Möglichkeiten. Beide sind erlaubt und ein vollständig implementierter XML-Parser hat mit keiner davon Probleme. Jetzt ist eigentlich die Aufgabe/Suche zu finden ob man einen XML-Parser darauf einstellen kann statt der Hexcodierung die Dezimalcodierung bei solchen Zeichen zu verwenden. |
AW: Kodierung in UCS-2 Little Endian
Zitat:
Die MultyByte-Zeichensätze werden Anhand des Encoding-Parameters in der XML-Processing-Instruction (
XML-Code:
) ermittelt.
<?xml encoding="...">
Und bei den Unicode-Zeichensätzen fängt es mit dem ersten "<" an, also ob und wo dort die #0 drin steht wird erstmal entschieden, ob Little-Endiian oder Big-Endian und dann das Encoding. Daher ist ein Encoding an den Load-Methoden nicht nötig, da alle nötigen Informationen genau definiert sind und immer in der Datei stehen müssen. (außer bei UTF-8, was ja der Standard ist) XML ist so gestaltet, daß man mitten beim Lesen das Encoding umschalten kann. (siehe die Processing-Instruction, welche es innerhalb des XML-Dokumentets nicht nur für XML gibt ... "xml" ist dort der Prozessor-Name) Und das mit den Sonderzeichen und dem "schrottigen" Parser hat der Vorgänger bereits erwähnt. |
AW: Kodierung in UCS-2 Little Endian
Zitat:
|
AW: Kodierung in UCS-2 Little Endian
Zitat:
Code:
oder als
& #10 ;
Code:
übertragen werden und ist dabei völlig gleichwertig. (Die Leerzeichen bitte wegdenken, aber wenn ich die wegmache, dann zeigt der Browser und Editor nur einen Zeilenumbruch an - warum wohl :mrgreen:)
& #xA ;
Code:
& - Escapezeichen
# - jetzt kommt ein Wert für ein Zeichen x - der Wert ist Hexadezimal ; - Ende der Durchsage |
AW: Kodierung in UCS-2 Little Endian
Zitat:
|
AW: Kodierung in UCS-2 Little Endian
&#10;
[edit] hmmmmmmmmmm, warum wandelt vB das & nicht um? :gruebel: & #38;#10; wird einfach gelöscht (doppelte Umwandlung? :wall:) |
AW: Kodierung in UCS-2 Little Endian
Sehe ich das richtig dass dem armen Mann im Endeffekt empfohlen wurde "Wird schon nichts außerhalb von UCS-2 vorkommen"?
Wenn es für mich noch nicht zu früh am Morgen ist dann entfernt man aus einem String doch einfach nur die Surrogates und hat einen String wo jedes Zeichen in die Basic Multilingual Plane, also 16 Bit, passt:
Delphi-Quellcode:
uses
System.SysUtils, System.Character; procedure RemoveNonUCS2(var str: String; const replacement: String = ''); var index: Integer; stringBuilder: TStringBuilder; begin stringBuilder := TStringBuilder.Create(str.Length); try index := 0; repeat if Char.IsSurrogatePair(str, index) then begin Inc(index); if (not replacement.IsEmpty()) then stringBuilder.Append(replacement); end else stringBuilder.Append(str.Chars[index]); Inc(index); until (index >= str.Length); str := stringBuilder.ToString(); finally stringBuilder.Destroy(); end; end; |
AW: Kodierung in UCS-2 Little Endian
Zitat:
|
AW: Kodierung in UCS-2 Little Endian
Erstellungsdatum des Threads? Anyone? :roll:
|
AW: Kodierung in UCS-2 Little Endian
Es ist nie zu spät gegen vergangene Verbrechen vorzugehen :warn:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz