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.
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
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
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