# String encoding überprüfen



## Vitus (27. Jun 2006)

Hallo,

kennt jemand eine Möglichkeit, einen String auf ein bestimmtes Character Set Encoding hin zu überprüfen (beispielsweise ISO-8599-1)? Da heißt, der String darf keine anderen Zeichen enthalten.

Thx a lot,
Vitus


----------



## derDachs (28. Jun 2006)

Ich nehme an das machst du Zeichen für Zeichen und musst halt selbst wissen welche Zeichen in der jeweiligen ISO vorhanden sind..
for schleife von 0 bis Stringende und jedes Zeichen mit String.charAt
prüfen ob es in deine ISOVorschrift drin ist..
Also brauchst du auch einen String wo die Zeichen der IsoNorm drinstehen....

wenn also nur ABCDEFG7890 erlaubt ist legst du dir halt diesen String an und vergleichst jeden Buchstaben in dem Text mit diesen Buchstaben im String...

bis denne....
derDachs  

mfG der Dachs...


----------



## foobar (28. Jun 2006)

Ich kann mir nicht vorstellen, daß man auf ein bestimmtes Encoding testen kann, da es sich hierbei um eine Representatio  handelt. D.h. im Grund ist ein String auch nur eine Folge von Bytes mit einem bestimmten Wert, denen durch das Encoding eben ein Zeichen zugeordnet wird. Woher soll der Rechner denn wissen was du haben willst? Die einzige Möglichkeit wäre, den kompletten String zu parsen und jedes Zeichen zu überprüfen.


----------



## byte (28. Jun 2006)

Strings sind doch immer Unicode kodiert. ???:L


----------



## Zilchinger (28. Jun 2006)

foobar hat vollkommen Recht. Das Überprüfen auf einen Zeichensatz ist nicht möglich.
Sprich man muß genau wissen, was man wo hinschickt, bzw was man von irgendwo her bekommt !!!


----------



## foobar (29. Jun 2006)

@byto es geht um Encodings im Allgemeinen z.b. String s die man aus einer Datei, DB, Socket liest.


----------



## Vitus (7. Jul 2006)

Meines Erachtens sollte folgende Lösung möglich sein:

Zum prüfen, ob ein String einem Encoding entspricht könnte geprüft werden, in dem man den String encoded und schaut, ob das Ergebnis wieder dem String entspricht. Ansonsten muss in dem String ein Zeichen gewesen sein, welches encoded werden musste.

Liege ich hier falsch?


----------



## moormaster (7. Jul 2006)

Vitus hat gesagt.:
			
		

> Meines Erachtens sollte folgende Lösung möglich sein:
> 
> Zum prüfen, ob ein String einem Encoding entspricht könnte geprüft werden, in dem man den String encoded und schaut, ob das Ergebnis wieder dem String entspricht. Ansonsten muss in dem String ein Zeichen gewesen sein, welches encoded werden musste.
> 
> Liege ich hier falsch?



Und wenn der String keine Zeichen enthält, die sich unterscheiden in den einzelnen Kodierungen?


----------



## Leroy42 (7. Jul 2006)

Kurz und schmerzvoll: Es kann nicht gehen!   

Jedes Encoding nutzt sämtliche möglichen Bytewerte.

Wenn z.b. der Bytewert 242 in einem Encoding ein 'ä' ist und
in einem anderen ein '€' und du in deinem Beispielstring diesen
Bytewert vorfindest, _ohne zu wissen_, welches Zeichen
an dieser Postion im String _sein soll_, ist es rein logisch
nicht möglich den String einem Encoding zuzuordnen, da beide
Repräsentationen möglich sind.

Nur wenn du den String zusätzlich in einem dir bekannten
Zeichensatz vorliegen hast (z.B. Unicode, UTF-8) ist es
machbar, über die Bytewerte, das Vorliegen eines bestimmten
Encodings _nicht auszuschließen_. Es kann dann aber immer
noch sein daß mehrere Encodings möglich sind. Z.B. dürften
sämtliche Encodings den String 'abcde' auf dieselbe Bytefolge abbilden.


----------



## moormaster (7. Jul 2006)

Leroy42 hat gesagt.:
			
		

> Kurz und schmerzvoll: Es kann nicht gehen!
> 
> Jedes Encoding nutzt sämtliche möglichen Bytewerte.
> 
> ...



Und dennoch ist es möglich, das Encoding zu erraten. Der Texteditor ConText z.B. erkennt automatisch, ob meine .java Dateien das Unix Format benutzen oder ein anderes. Das versucht er wahrscheinlich an den Zeilenumbrüchen zu erkennen. Bis jetzt hat er das immer richtig erkannt; aber ich glaube bei sehr kurzen Dateien, die wenig "aussergewöhnliche" Zeichen benutzen, wird der Editor auch mal falsch liegen.

Am besten ist es, wenn man in seinen Programmen einfach den Zeichensatz einstellen kann und das Programm dann durchweg mit diesem arbeitet.


----------



## Leroy42 (7. Jul 2006)

moormaster hat gesagt.:
			
		

> Und dennoch ist es möglich, das Encoding zu erraten.


Naja, erraten ist ja nicht das, was gefordert wurde...



			
				moormaster hat gesagt.:
			
		

> ob meine .java Dateien das Unix Format benutzen oder ein anderes. Das versucht er wahrscheinlich an den Zeilenumbrüchen zu erkennen.



Die Bytefolge für Zeichenumbruch ist BS-spezifisch und hat nichts mit den Encodings zu tun.


----------



## moormaster (7. Jul 2006)

Leroy42 hat gesagt.:
			
		

> Die Bytefolge für Zeichenumbruch ist BS-spezifisch und hat nichts mit den Encodings zu tun.



Nö  Aber ob ich mit UTF 8, Ansi, ... gespeichtert hab, kann er trotzdem zumindest erraten


----------



## Roar (7. Jul 2006)

das einzige was du machen kannst, ist, soweit ich weiß, die ersten beiden bytes der datei zu überprüfen. wenn die datei mit utf-16 encodiert ist, lauten die nämlich FE FF. *schulternZuck*


----------



## byte (7. Jul 2006)

Naja, ASCII sind 7bit und UTF8 eben 8bit pro Zeichen. Da kann man vielleicht noch über die Kodierung entscheiden, aber spätestens wenn Du zwei 8bit Kodierungen hast, wird es quasi unmöglich.

Versuch z.B. mal zwischen ISO-8859-1 und z.B. ISO-8859-2 zu unterscheiden -> geht nicht.


----------



## Leroy42 (7. Jul 2006)

moormaster hat gesagt.:
			
		

> Nö  Aber ob ich mit UTF 8, Ansi, ... gespeichtert hab, kann er trotzdem zumindest erraten



Anhand welcher Kriterien denn?

Woher soll das Programm denn erraten, welche Zeichen denn _gemeint waren_?
Der eine will hatte eben ein 'Ä' gespeichert, der andere ein '€' und der dritte ein
hebräisches Schriftzeichen.


Soll das Programm den Text analysieren und versuchen, gültige Wörter zu erkennen?  :autsch: 



			
				Roar hat gesagt.:
			
		

> das einzige was du machen kannst, ist, soweit ich weiß, die ersten beiden bytes der datei zu überprüfen. wenn die datei mit utf-16 encodiert ist, lauten die nämlich FE FF. *schulternZuck*



Also, Wenn UTF-16 ==> FEFF

Aber nicht 

Wenn FEFF ==> UTF-16

Vielleicht ist es _ja doch_ eine ISO-8859-1 codierte Datei und der Ersteller
*wollte* als erste Zeichen der Datei ja unbedingt dieses p und y (siehe die
letzten beiden Zeichen im folgenden Bild) in seiner Datei haben!







Wie ich schon schrieb: Es _kann_ rein logisch nicht möglich sein!


----------



## moormaster (7. Jul 2006)

Ich weiss wie gesagt nicht, woran das Programm die Kodierung genau festmacht; aber nach gewissen Kriterien sucht es sich eben eine Kodierung aus, die in den meisten Fällen zu passen scheint (mir ist es zumindest noch nicht untergekommen, dass es einmal merklich die "falsche" Kodierung genommen hat).

Sicherlich mag es logisch nicht eindeutig feststellbar sein. Vielleicht hat das Programm auch eine Art Prioritätsliste, welche Kodierung bevorzugt wird. Wenn dann gewisse (evtl. eher unübliche) Zeichen vorkommen, könnte sich die Priorität verändern, so dass eine andere Kodierung ganz oben steht. Wenn kein solches Zeichen gefunden wird, bleibt die Liste wie sie ist und es wird die noch immer ganz oben stehende Kodierung genutzt.

Das wäre so gaaanz ungefähr ein Ansatz, wie man die Kodierung erraten kann. 100%ig feststellen, kann man sie trotzdem nicht; weil die "unüblichen" Zeichen ja durchaus genau dort mit genau dieser Kodierung stehen sollten können, wo sie anzutreffen waren.


----------



## Leroy42 (7. Jul 2006)

moormaster hat gesagt.:
			
		

> Wenn dann gewisse (evtl. eher unübliche) Zeichen vorkommen...



Dann definier' bitte mal "_Eher unüblich_"  :shock: 

Schließlich soll dies ja ein Algorithmus entscheiden/erkennen
und kein dahergelaufener nicht-deterministischer-Automat wie du und ich!


----------



## Leroy42 (7. Jul 2006)

Sorry, habe erst jetzt dein Post zuende gelesen   

Dann sind wir ja doch einer Meinung.

Dein Vorschlag, eine Heuristik zu implementieren, wäre dann
natürlich eine ziemlich gute (vielleicht ausreichende) Annäherung.


----------



## Lim_Dul (7. Jul 2006)

Wenn man sich auf die deutsche Sprache einschränkt, kann man Tefferquoten nahe bei 100% erzielen. Dazu reicht es, nach den UTF-* bzw. ISO-Kodierungen der deutschen Sonderzeichen (öüäß) zu suchen und das dazu passende Encoding zu verwenden. Dann dürfte man, sofern diese Sonderzeichen vorkommen, so gut wie nie falsch liegen.


----------



## byte (7. Jul 2006)

Das würde ich so nicht unterschreiben. Wie gesagt, es steht kein *ß* in der Datei sondern ein Code, also eine Zahl. Erst die Interpretation dieser Zahl (je nach Kodierung) ergibt dann das das Zeichen. Die Codes sind halt nicht zwischen den verschiedenen Kodierungen disjunkt. Wenn in Kodierung A das *ß* den Code 17 hat, dann kann die 17 in Kodierung B vielleicht ein ganz anderes Zeichen sein.

In der Praxis gleichen sich sogar viele Encodings bis zu einem gewissen Grad. Zum Beispiel ISO-8859-1 vs Unicode (UTF-8). Einfach mal im Browser auf UTF-8 umstellen. Das meiste kann man immer noch lesen, ausser die deutschen Sonderzeichen.


----------



## Lim_Dul (7. Jul 2006)

byto hat gesagt.:
			
		

> Das würde ich so nicht unterschreiben. Wie gesagt, es steht kein *ß* in der Datei sondern ein Code, also eine Zahl. Erst die Interpretation dieser Zahl (je nach Kodierung) ergibt dann das das Zeichen. Die Codes sind halt nicht zwischen den verschiedenen Kodierungen disjunkt. Wenn in Kodierung A das *ß* den Code 17 hat, dann kann die 17 in Kodierung B vielleicht ein ganz anderes Zeichen sein.
> 
> In der Praxis gleichen sich sogar viele Encodings bis zu einem gewissen Grad. Zum Beispiel ISO-8859-1 vs Unicode (UTF-8). Einfach mal im Browser auf UTF-8 umstellen. Das meiste kann man immer noch lesen, ausser die deutschen Sonderzeichen.



Richtig. Deshalb schrieb ich ja, wenn ich mich a) auf die deutsche Sprache einschränke und b) ich ein ß in UTF-8 finde, dann kann ich von UTF-8 ausgehen. Finde ich das ß in ISO-8859-1/15, dann kann ich von ISO ausgehen. Die Wahrscheinlichkeit, dass eine *deutsche* Text-Datei als ISO gewünscht ist UND die Zeichen enthält, die in UTF-8 dem ß entsprechen, tendiert gegen 0.


----------



## Vitus (10. Jul 2006)

Nochmal langsam:

Ich habe einen String (in Java-UTF16) und möchte checken, ob dieser nur ISO-8599-1 Zeichen enthält.

Mein Gedanke ist, diesen in ISO-8599-1 umzuwandeln. Wenn ich jetzt wieder der gleiche String erhalte, sollte der ursprüngliche ISO-8599-1 entsprechen.

Liege ich hier falsch?


----------



## Leroy42 (10. Jul 2006)

Vitus hat gesagt.:
			
		

> ob dieser nur ISO-8599-1 Zeichen enthält.



Dazu müßtest du aber erstmal ISO-8599-1 definieren.  :shock: 

Oder meintest du etwas ISO-8859-1.   



			
				Vitus hat gesagt.:
			
		

> Mein Gedanke ist, diesen in ISO-8859-1 umzuwandeln. Wenn ich jetzt wieder der gleiche String erhalte, sollte der ursprüngliche ISO-8859-1 entsprechen.
> Liege ich hier falsch?



Wenn du *vorher weißt*, daß du einen UTF-16 encodeten String hast geht das
natürlich. 

Allerdings versagt deine Umwandlung, wenn der Originalstring Zeichen enthält,
die _nicht_ in der Schnittmenge von UTF-16 und ISO-8859-1 liegen.

(Bei 'a', 'b', ..., 'z' ist z.B. alles OK. Es gibt aber (mit Sicherheite) ISO-8859-1 Zeichen die
in UTF-16 anders kodiert werden.)


----------

