2013-05-03 12 views
8

Ich bin ziemlich neu, also nicht zu hart sein :)Warum wird meine Unicode-Zeichenfolge beschädigt, wenn sie von Java Applet an Java Script übergeben wird?

Frage (tl; dr)

Ich bin ein Unicode-String von einer eingebetteten javax.swing.JApplet in einer Web-Seite zu einem Problem vorbei der Java Script Teil. Ich bin nicht sicher, ob dies ist, ob ein Fehler oder ein Missverständnis der beteiligten Technologien:

Problem

ich einen Unicode-String aus einem Java-Applet Java Script übergeben will, aber der String wird vermasselt. Seltsamerweise tritt das Problem nicht nicht in Internet Explorer 10 sondern in Chrome (v26) und Firefox (v20). Ich habe jedoch andere Browser nicht getestet.

Der zurückgegebene String scheint in Ordnung zu sein, mit Ausnahme des letzten Unicode-Zeichens. Das Ergebnis in der Java-Script-Debugger und Web-Seite wäre:

  • abc → abc
  • 表示 → 表
  • ま → ま
  • ウ ォ ッ チ リ ス ト → ウ ォ ッ チ リ ス
  • ア ッ プ ロ ー ド→ ア ッ プ ロ ー
  • ホ →
  • ホ → ホ (nicht deterministisch)
  • ア ッ プ ロ ー ド abc → ア ッ プ ロ ー ド abc

Die Saite scheint auf die letzten Bytes beschädigt werden. Wenn es mit einem ASCII-Zeichen endet, ist die Zeichenfolge in Ordnung. Zusätzlich tritt das Problem nicht in jeder Kombination auf und auch nicht jedes Mal (da bin ich mir nicht sicher). Daher vermute ich einen Bug und ich befürchte, ich könnte eine ungültige Frage stellen.

Test Set Up

Eine minimalistische Einrichtung enthält ein Applet, das eine Unicode (UTF-8) Strings zurückgibt:

/* TestApplet.java */ 
import javax.swing.*; 

public class TestApplet extends JApplet { 

private String[] testStrings = { 
      "abc", // OK (because ASCII only) 
      "表示", // Error on last Character 
      "表示", // Error on last Character 
      "ホーム ", // OK (because of *space* after ム) 
      "アップロード", ... }; 
    public TestApplet() {...};  // Applet specific stuff 

    ... 

    public int getLength() { return testStrings.length;}; 

    String getTestString(int i) { 
     return testStrings[i]; // Build-in array functionality because of IE. 
    } 
} 

Die entsprechende Webseite mit Java-Skript könnte wie folgt aussehen:

/* test.html */ 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    </head> 
    <body> 
     <span id="output"/> 
     <applet id='output' archive='test.jar' code=testApplet/> 
    </body> 

    <script type="text/javascript" charset="utf-8"> 
     var applet = document.getElementById('output'); 
     var node = document.getElementById("1"); 
     for(var i = 0; i < applet.getLength(); i++) { 
      var text = applet.getTestString(i); 
     var paragraphNode = document.createElement("p"); 
     paragraphNode.innerHTML = text; 
     node.appendChild(paragraphNode); 
     } 
    </script> 
</html> 

Umwelt

ich arbeite an Windows 7 32-Bit mit der aktuellen Java Version 1.7.0_21 mit dem "Next Generation Java Plug-in 10.21.2 für Mozilla Browser". Ich hatte einige Probleme mit meinem Betriebssystem-Gebietsschema, aber ich habe mehrere (Englisch, Japanisch, Chinesisch) regionale Einstellungen versucht.

Im Falle einer beschädigten Zeichenfolge zeigt Chrom ungültige Zeichen (z. B. ). Firefox hingegen löscht den String komplett, wenn er mit enden würde.

Internet Explorer kann die Strings korrekt anzeigen.

Lösungen?

Ich kann mir mehrere Problemumgehungen vorstellen, einschließlich Escaping/Unescaping und Hinzufügen eines "endgültigen Char", das dann über Java-Skript entfernt wird. Eigentlich plane ich, gegen Androids Webkit zu schreiben, und ich habe es dort nicht getestet.

Da ich gerne in Chrome weiter testen würde (wegen der Webkit-Technologie und des Komforts) hoffe ich, dass es eine triviale Lösung für das Problem gibt, die ich vielleicht übersehen habe.

+2

Ich bin daran interessiert, was das eigentliche Problem ist. Eine Idee, die ich gefunden habe, ist: Stellen Sie sicher, dass 'javac' und/oder' jar' die UTF8-Kodierung verwendet - wenn Sie es nicht angeben, verwendet es den Maschinenstandard (was * ein * Problem sein könnte) – Ian

+1

Danke! Ich werde das später versuchen. Ich möchte darauf hinweisen, dass der Datenfluss von Java Script zu Applet (Aufrufparameter) wie erwartet funktioniert. Nur die Rückkehr wird durcheinander gebracht. – Inuniku

+1

Absolut. Sie haben gezeigt/erklärt, dass alles gut funktioniert, mit Ausnahme der Zeichenfolge, die in speziellen Fällen zurückgegeben wird (das letzte Zeichen in der zurückgegebenen Zeichenfolge hat ein Unicode-Zeichen). Ich denke, du hast die Situation sehr gut erklärt und alles sehr übersichtlich angelegt :) – Ian

Antwort

1

Wenn Sie in Chrome testen/Firefox

Bitte ersetzen ersten Zeile mit diesem und es dann testen,

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 

Der Doctype hat erheblichen Wert, während Browser die Seite identifiziert.

Übergangsweise/verlieren Sie die Typen, die Sie mit Unicode verwenden können. Bitte testen und antworten ..

+0

Vielen Dank für Ihre Eingabe! Ich habe das versucht, aber immer noch kein Glück. – Inuniku

+0

Können Sie HTML der Seite nach Generierung der Seite/des Links der Seite (wenn live), das wird weiter helfen. – MarmiK

1

Ich schlage vor, einen Haltepunkt setzen auf

paragraphNode.innerHTML = text; 

und überprüfen Text, um ihn in der JavaScript-Konsole, zum Beispiel mit

console.log(escape(text)); 

oder

console.log(encodeURIComponent(text)); 

oder

for (i=0; i < text.length; i++) { 
    console.log("i = "+i); 
    console.log("text.charAt(i) = "+text.charAt(i) 
    +", text.charCodeAt(i) = "+text.charCodeAt(i)); 
} 

Siehe auch

http://www.fileformat.info/info/unicode/char/30a6/index.htm

https://developer.mozilla.org/en-US/docs/DOM/window.escape (die nicht Teil eines stan ist dard)

und

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent

oder ähnliche Mittel.

Ihre Source-Dateien Sie können nicht davon ausgehen, in der Codierung sein (UTF-8).

JavaScript geht davon aus UTF-16-Strings:

http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.16

Java geht auch davon aus UTF-16:

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html

Der Linux oder Cygwin file Befehl Sie die Codierung Ihrer Dateien zeigen .

Siehe

http://linux.die.net/man/1/file (haben keine kernel.org Mann Referenz gefunden)

+0

Vielen Dank für Ihre ausgearbeitete Antwort! Mit der 'encodeURI' Funktion konnte ich die letzten" beschädigten "Bytes in Chrome ausgeben: Sie scheinen alle mit'% EF% BF% BD% EF% BF% BD% 00' zu enden. Nicht sicher, ob es das echte Merkmal ist, denn Firefox zeigt überhaupt keine beschädigte Zeichenkette an (gibt in diesem Fall eine Zeichenkette mit der Länge 0 zurück). Eigentlich konnte ich das Problem für mein Betriebssystem lösen (siehe meine peinliche Antwort). Aber es betrifft immer noch andere Ländereinstellungen ... Vielleicht bleibt die Frage mit der Änderung gültig. – Inuniku

0

Okay, ich bin ein wenig peinlich, weil ich dachte, ich versuchte es genug: Ich war eigentlich nicht mit Latin locale (e.g Chinesisch (VR China) oder Japanisch (Japan) im Windows-System locale settings. Als ich zurück zu Englisch (USA) oder Deutsch (Deutschland) wechselte alles funktionierte als erwartet.

Ich frage mich immer noch, warum es Chrome & Mozilla in einer so seltsamen Weise beeinflussen würde, weil Java und moderne Browser Unicode-basiert sein sollten; Also werde ich das nicht als Antwort akzeptieren! Das Problem tritt wieder auf, wenn ich auf Japanisch zurückwechsle, und ich werde es auf verschiedenen Systemen testen.

Ich möchte mich für alle Poster für den Enlightning-Input bedanken ... und ich werde mich noch bemühen, diese Frage zu lösen.

1

Sie müssen sicherstellen, dass das folgende Java-Argument zu Ihrem Applet/embed Tag hinzuzufügen:

-Dfile.encoding = utf-8

dh java_arguments = "- Dfile.encoding = utf-8 "

Andernfalls wird das Applet als ASCII-Text erwartet und behandelt.