Sokrates: prüfen ob eine Eingabe in einem Input-Feld GB 2312 enthält

Hallöle,

weis jemand wie man prüft ob eine Eingabe in einem Input-Feld dem Zeichensatz GB 2312 für vereinfachtes chinesisch entspricht, bzw. wie man es erzwingt. Muss nicht mit Javascript sein.

Danke in voraus,

Sokrates

  1. echo $begrüßung;

    weis jemand wie man prüft ob eine Eingabe in einem Input-Feld dem Zeichensatz GB 2312 für vereinfachtes chinesisch entspricht, bzw. wie man es erzwingt.

    Einen Text kann man nur gemäß den Regeln einer bestimmten Zeichenkodierung prüfen. Das geht nur mit Mehrbyte-Kodierungen, die für bestimmte Bytefolgen ein Zeichen definieren und andere als ungültig erklären. Finden sich keine ungültigen Bytefolgen, ist das allerdings nur ein Indiz, denn die Bytefolgen können unter Umständen auch zu anderen Kodierungen passen und außerdem gibt es immer noch jede Menge Einbyte-Kodierungen, die im Prinzip immer passen. Man könnte dann nur anhand von Wahrscheinlichkeiten bestimmte Kodierungen ausschließen. Das Ergebnis der Dekodierung kann aber letztlich nur ein Mensch als sinnvoll oder nicht beurteilen. Ansätze mit Prüfungen gegen Wörterbücher liefern nicht in jedem Fall ein korrektes Ergebnis.

    Zwingen kann man einen Browser in keinem Fall. Man kann Vorgaben machen und hoffen, dass Browser und Anwender sie einhalten. Da wären die Kodierung der Seite in der das Formular/Eingabefeld steht und das accept-charset-Attribut eines Formulars, aber letzteres wird nicht in jedem Fall sinnvoll von den Browser berücksichtigt.

    echo "$verabschiedung $name";

    1. Hallöle,

      ja, an den 'accept-charset-Attribut' hatte ich auch schon gedacht. Das blöde ist nur das ich innerhalb des selben Formulars sicherstellen muss das ein paar Angaben in chinesischen Zeichen und ein Paar in lateinischen Buchstaben erfolgt. Ich suche nach einer Methode mit der ich erkennen kann ob es sich dabei um ein Zeichen handelt das ein chinesisches sein könnte. Hab dabei auch an so lustige Dinge wie den Ausschluss von allen ascii-zeichen die nicht zur Codieren von GB 2312 benutzt werden. In javascript sehen die chinesischen Zeichen ungefähr so aus. 匶 Wäre es nicht ein möglicher Ansatz zu Prüfen ob der Wert zw. ✐ und  &#70000 liegt. wobei ich die Zahlen einfach mal schätze. Müsste mich noch informieren ob es da einen eingegrenzten Bereich gibt in dem vereinfachtes chinesisch liegt.

      Bin dankbar für jeden Vorschlag.

      Browser sind zunächst nicht das Problem da dies nur von ausgewählten Partner in China benutzt werden wird. Die können wir hoffentlich zwingen einen bestimmten Browser zu benutzen. php-Lösungen wären mir allerdings lieber. Zur Erzwingung würde es mir übrigens genügen wenn er nach der Eingabe oder nach dem Absenden gesagt bekäme das die Eingabe falsch war und er das gefälligst so oder so machen soll.

      Danke weiterhin

      echo $begrüßung;

      »» weis jemand wie man prüft ob eine Eingabe in einem Input-Feld dem Zeichensatz GB 2312 für vereinfachtes chinesisch entspricht, bzw. wie man es erzwingt.

      Einen Text kann man nur gemäß den Regeln einer bestimmten Zeichenkodierung prüfen. Das geht nur mit Mehrbyte-Kodierungen, die für bestimmte Bytefolgen ein Zeichen definieren und andere als ungültig erklären. Finden sich keine ungültigen Bytefolgen, ist das allerdings nur ein Indiz, denn die Bytefolgen können unter Umständen auch zu anderen Kodierungen passen und außerdem gibt es immer noch jede Menge Einbyte-Kodierungen, die im Prinzip immer passen. Man könnte dann nur anhand von Wahrscheinlichkeiten bestimmte Kodierungen ausschließen. Das Ergebnis der Dekodierung kann aber letztlich nur ein Mensch als sinnvoll oder nicht beurteilen. Ansätze mit Prüfungen gegen Wörterbücher liefern nicht in jedem Fall ein korrektes Ergebnis.

      Zwingen kann man einen Browser in keinem Fall. Man kann Vorgaben machen und hoffen, dass Browser und Anwender sie einhalten. Da wären die Kodierung der Seite in der das Formular/Eingabefeld steht und das accept-charset-Attribut eines Formulars, aber letzteres wird nicht in jedem Fall sinnvoll von den Browser berücksichtigt.

      echo "$verabschiedung $name";

      1. echo $begrüßung;

        ja, an den 'accept-charset-Attribut' hatte ich auch schon gedacht. Das blöde ist nur das ich innerhalb des selben Formulars sicherstellen muss das ein paar Angaben in chinesischen Zeichen und ein Paar in lateinischen Buchstaben erfolgt.

        Quäl dich nicht mit unterschiedlichen Kodierungen. Verwende konsequent eine. Auch in GB2312 sind die lateinischen Buchstaben enthalten, nur anders kodiert als in ISO-8859-x. Besser ist es jedoch, wenn du den "alten Mist" unberücksichtigt lässt und UTF-8 verwendest. Zur Not kannst du immer noch umkodieren (wenn auch nicht in jedem Fall verlustfrei), wenn irgendeine Schnittstelle unbedingt eine andere Kodierung haben will.

        In javascript sehen die chinesischen Zeichen ungefähr so aus. 匶 Wäre es nicht ein möglicher Ansatz zu Prüfen ob der Wert zw. ✐ und  &#70000 liegt. wobei ich die Zahlen einfach mal schätze. Müsste mich noch informieren ob es da einen eingegrenzten Bereich gibt in dem vereinfachtes chinesisch liegt.

        Das sind nummerische Zeichenreferenzen (NCR), die Unicode entsprechen. Es gibt aber keine Garantie, dass alle Browser zu NCRs greifen, wenn Zeichen eingegeben werden, die nicht in der Kodierung der das Formular enthaltenden Seite vorkommen. Nimm lieber gleich konsequent UTF-8.

        Bitte sinnvoll zitieren und nicht im TOFU-Stil.

        echo "$verabschiedung $name";

        1. Moin!

          »» In javascript sehen die chinesischen Zeichen ungefähr so aus. 匶

          Nein, so sehen sie in Javascript nie aus. Javascript arbeitet komplett in Unicode, da treten keine numerischen Zeichenreferenzen auf.

          Wenn numerische Zeichenreferenzen (oder Entities) im HTML-Quelltext stehen, wandelt der Browser sie beim Laden der Seite in das zugehörige Unicode-Zeichen um, bevor Javascript darauf zugreifen kann. Javascript sieht nur das Unicode-Zeichen. Und wenn diese Zeichenreferenzen im Javascript-Teil stehen, dann werden sie dort als eine Zeichenkette von &-Zeichen, #-Zeichen, Ziffern und Semikolon gewertet, nicht als Unicode-Zeichen. Um ohne unicode-fähige Zeichencodierung in Javascript-Quelltext Unicode-Zeichen zu transportieren, wäre die Javascript-Form des Zeichenescapings notwendig: string = "\u5336"; (hexadezimale Zahlendarstellung von 21302).

          Wäre es nicht ein möglicher Ansatz zu Prüfen ob der Wert zw. ✐ und  &#70000 liegt. wobei ich die Zahlen einfach mal schätze. Müsste mich noch informieren ob es da einen eingegrenzten Bereich gibt in dem vereinfachtes chinesisch liegt.

          Würde Unicode bzw. die Codierung UTF-8 verwendet, wären chinesische Zeichen eindeutig anhand ihres Zeichencodes identifizierbar. Wobei einschränkend gesagt werden muss, dass der Zeichenbereich für "chinesische" Zeichen aufgrund einer Vereinheitlichungsbemühung der Zeichendarstellung von Chinesisch, Japanisch und Koreanisch (Abkürzung: CJK) zusammenfällt, und es durchaus Muttersprachler in allen drei betroffenen Sprachregionen gibt, die über die getroffenen Vereinheitlichungen nicht sehr glücklich sind. Das Auftreten von Zeichen aus dem entsprechenden Zeichenbereich ist also kein sicherer Indikator für "chinesisch" - aber dasselbe Problem haben wir ja auch mit dem europäischen Alphabet: Die 26 Zeichen sind kein sicherer Indikator für z.B. Englisch.

          Das sind nummerische Zeichenreferenzen (NCR), die Unicode entsprechen. Es gibt aber keine Garantie, dass alle Browser zu NCRs greifen, wenn Zeichen eingegeben werden, die nicht in der Kodierung der das Formular enthaltenden Seite vorkommen. Nimm lieber gleich konsequent UTF-8.

          Das muss ich unterstreichen: Es ist heutzutage bei allen Neuentwicklungen vollkommener Schwachsinn, auf UTF-8 zu verzichten. In die Encoding-Hölle mit proprietären Zeichentabellen will man sich einfach nicht begeben. Nur mit UTF-8 ist sicherstellbar, dass die Browser wirklich alle Zeichen verarbeitbar und unbeschädigt an den Server übertragen. Alle anderen Codierungen, die jeweils nur einen Teilbereich der Unicode-Zeichen definieren, leiden immer daran, dass es Zeichenverluste geben kann.

          Wenn man die Zeichen erst einmal unbeschädigt auf dem Server hat, kann man immer noch darangehen und Filterregeln anwenden, um als unzulässig definierte Zeichen auszuschließen. Aber das primäre Interesse sollte immer sein, die Zeichen erst einmal komplett und vollständig zu erhalten.

          - Sven Rautenberg