String auf codierung prüfen
Jörg
- php
Hi,
ich habe im Netz 2 Versionen gefunden, mit der ich einen String auf seine codierung prüfen können soll.
Anscheinend funktionieren beide nicht so recht?
// Returns true if $string is valid UTF-8 and false otherwise.
function is_utf8($string) {
// From http://w3.org/International/questions/qa-forms-utf-8.html
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string);
} // function is_utf8
Kann jemand bestätigen, dass diese Funktion sauber arbeitet?
Jörg
hi,
Kann jemand bestätigen, dass diese Funktion sauber arbeitet?
Das nicht, aber ich kann Dir ein kleines Forumlar anbieten, womit Du die Zeichenkodierung in einer Datei prüfen kannst: UTF-8-Test
Es unterscheidez zwischen utf-8, ascii und 8-bit(iso) Kodierung.
Hotti
Tach,
Das nicht, aber ich kann Dir ein kleines Forumlar anbieten, womit Du die Zeichenkodierung in einer Datei prüfen kannst: UTF-8-Test
Es unterscheidez zwischen utf-8, ascii und 8-bit(iso) Kodierung.
wie MudGuard schreibt, kann man UTF-8 nicht zuverlässig erkennen (höchstens ausschließen) und so scheitert dein Test an einer ISO-kodierten Datei, die den Testtext von dedlfix enthält und benennt sie als UTF-8. Du solltest zumindest dazuschreiben, dass diese Erkennung zum Teil auf Raten basiert.
mfg
Woodfighter
hi,
wie MudGuard schreibt, kann man UTF-8 nicht zuverlässig erkennen (höchstens ausschließen) und so scheitert dein Test an einer ISO-kodierten Datei, die den Testtext von dedlfix enthält
Sei mal sogut und schick mir die Datei (oder ein Hexmap).
Vielen Dank,
Hotti
Hi!
wie MudGuard schreibt, kann man UTF-8 nicht zuverlässig erkennen (höchstens ausschließen) und so scheitert dein Test an einer ISO-kodierten Datei, die den Testtext von dedlfix enthält
Sei mal sogut und schick mir die Datei (oder ein Hexmap).
Sei mal so gut und bring den folgenden Satz in eine Datei, die als ISO-8859-1 gespeichert wird:
"Ein deutsches scharfes s, UTF-8-kodiert aber als ISO-8859-1 interpretiert sieht so aus: ß"
Lo!
hi,
Sei mal so gut und bring den folgenden Satz in eine Datei, die als ISO-8859-1 gespeichert wird:
"Ein deutsches scharfes s, UTF-8-kodiert aber als ISO-8859-1 interpretiert sieht so aus: ß"
Haha, das sehe ich sofort, die Datei können wir uns sparen ;)
Ja, danke Dir, alles klar, verstehe. Es gibt einige Bytefolgen, die aneinandergereiht auf die U-Schablone (Perl) passen, Beispiele (dezimal):
In ISO sinds 4 Zeichen, in UTF-8 sinds dann 2. Schöne Worte sind das jedoch nicht und ein 'ß' als 'ß' auszusprechen bedarf eines geübten Blickes.
Viele Grüße,
Hotti
PS, Sprich mal rückwärts:
"Nebel bei Siebleben"
(den Ort gibts tatsächlich, liegt in Thüringen, Vorort von Gotha)
Hi!
PS, Sprich mal rückwärts:
"Nebel bei Siebleben"
Hör dir mal Joseph Haydns Symphonie Nr. 47 in G-Dur rückwärts gespielt an.
FG Ulysses
hi,
Hör dir mal Joseph Haydns Symphonie Nr. 47 in G-Dur rückwärts gespielt an.
Palindrom im 3. Satz.
War auch in der Rockmusik mal Mode...
Hotti
hi again,
"Ein deutsches scharfes s, UTF-8-kodiert aber als ISO-8859-1 interpretiert sieht so aus: ß"
Mit anderen Worten: Wenn die einzelnen Bytes zwischen 161 und 255 liegen, ist es auch möglich, dass die Zeichen ISO-kodiert sind. Das habe ich jetzt in mein Script eingebaut, weil ich vor ein paar Tagen vergessen hatte, auch daran zu denken.
Danke Dir!!!!
Hotti
hi,
wie MudGuard schreibt, kann man UTF-8 nicht zuverlässig erkennen (höchstens ausschließen) und so scheitert dein Test an einer ISO-kodierten Datei, die den Testtext von dedlfix enthält und benennt sie als UTF-8. Du solltest zumindest dazuschreiben, dass diese Erkennung zum Teil auf Raten basiert.
Die Unterscheidung der Fälle:
7 bit (ascii)
8 bit (iso)
mehr als 8 bit (utf8)
gemischt (utf8 passt, iso passt auch)
würde ich nicht als Raten bezeichnen. Das lässt sich exakt feststellen, wobei das natürlich vom Entwicklungsstand der Unicode-Unterstützung der jeweiligen Programmiersprache abhängt.
Hotti
Hi,
7 bit (ascii)
8 bit (iso)
kann auch EBCDIC, Win1252, ... sein ...
mehr als 8 bit (utf8)
gemischt (utf8 passt, iso passt auch)
Wie unterscheidest Du diese beiden Fälle?
Jedes beliebige Byte ist ein gültiges EBCDIC-Zeichen oder Win1252-Zeichen oder ISO-8850-x Zeichen.
cu,
Andreas
Hallo,
Die Unterscheidung der Fälle:
7 bit (ascii)
8 bit (iso)
mehr als 8 bit (utf8)
gemischt (utf8 passt, iso passt auch)
würde ich nicht als Raten bezeichnen.
doch, schon - denn "mehr als 8 bit" hast du nicht. Du kriegst deinen Text immer als Folge von Bytes angeliefert.
Sobald Werte im Bereich 0x80..FF dabei sind, kann es nicht mehr ASCII sein - aber sonst so ziemlich alles.
Das lässt sich exakt feststellen
Nein, wie dedlfix schon an einem Beispiel gezeigt hat.
Ciao,
Martin
Tach,
Die Unterscheidung der Fälle:
7 bit (ascii)
8 bit (iso)
mehr als 8 bit (utf8)
gemischt (utf8 passt, iso passt auch)würde ich nicht als Raten bezeichnen.
Jeder gültige UTF-8-Text ist immer ein gültiger ISO-8859-*-Text, sobald du also ausgibst, dass ein Text UTF-8 ist, mußt du schon geraten haben, es ist nicht automatisch erkennbar. Der Umkehrschluß ist nicht zulässig, da z.B. auf ein Startbyte die passende Anzahl Folgebytes folgen müssen und z.B. die 13 höchsten Bytewerte nicht vorkommen können, kann man daran erkennen, dass ein Text nicht UTF-8 sein kann.
mfg
Woodfighter
Hi!
ich habe im Netz 2 Versionen gefunden, mit der ich einen String auf seine codierung prüfen können soll.
"Auf seine Kodierung" ist zu allgemein formuliert. Die Funktion testet lediglich auf gültiges UTF-8. Ob allerdings wirklich UTF-8 gemeint ist, ist theoretisch nur durch eine Sinn-Analyse feststellbar. Praktisch werden wohl eher kaum die UTF-8-Byte-Sequenzen in "normalen" Texten vorkommen.
"Ein deutsches scharfes s, UTF-8-kodiert aber als ISO-8859-1 interpretiert sieht so aus: ß"
Dieser Satz ist gültiges UTF-8, ergibt aber nur als ISO-8859-1 interpretiert einen Sinn.
Kann jemand bestätigen, dass diese Funktion sauber arbeitet?
Sie sieht zumindest auf den ersten bis dritten Blick betrachtet richtig aus.
Lo!
Hi,
ich habe im Netz 2 Versionen gefunden, mit der ich einen String auf seine codierung prüfen können soll.
Aus einem Byte-Haufen sicher auf die Codierung zu prüfen ist nicht möglich.
Man kann unter Umständen Codierungen ausschließen, aber genau festzustellen, welche Codierung es ist, ist nicht möglich.
Ausschließen kann man z.B. US-ASCII, sobald ein Byte mit gesetztem höchsten Bit dabei ist.
In UTF-8 ist auch nicht jede Byte-Folge erlaubt - tritt eine nicht-erlaubte Folge auf, kann's kein UTF-8 sein.
In Codierungen wie EBCDIC, ISO-8859-x, Windows 1252 ist jedes Byte erlaubt - somit kann keine davon ausgeschlossen werden.
cu,
Andreas
Hi,
solange dir das "Source-Encoding" nicht bekannt ist, kannst du das nicht prüfen. Das Ergebnis ist undefiniert aber kompatibel.
LG