Jestem całkiem nowy, więc nie bądź zbyt surowy :)Dlaczego mój ciąg znaków Unicode ulega uszkodzeniu po przejściu z apletu Java do Java Script?
Pytanie (tl; dr)
jestem w obliczu problemu przechodząc unicode String
z osadzonym javax.swing.JApplet
na stronie internetowej część Java Script. Nie jestem pewien, czy to jest błąd lub nieporozumienie z zaangażowanymi technologiach:
Problem
Chcę przekazać ciąg Unicode z Java aplet Java Script, ale String dostaje pomieszane. O dziwo, problem nie występuje w wersji Internet Explorer 10, ale w Chrome (v26) i Firefox (v20). Nie testowałem jednak innych przeglądarek.
Zwrócony łańcuch wydaje się być w porządku, z wyjątkiem ostatniego znaku Unicode. Wynik w Java Script Debugger i strony internetowej będzie:
- abc → abc
- 表示 → 表
- ま → ま
- ウ ォ ッ チ リ ス ト → ウ ォ ッ チ リ ス
- ア ッ プ ロ ー ド→ ア ッ プ ロ ー
- ホ →
- ホ → ホ (nie deterministyczny)
- ア ッ プ ロ ー ド abc → ア ッ プ ロ ー ド abc
Ciąg wydaje się uszkodzony w ostatnich bajtów. Jeśli kończy się znakiem ASCII, łańcuch jest w porządku. Ponadto problem nie występuje w każdej kombinacji, a także nie zawsze (nie jest to pewne). Dlatego podejrzewam błąd i obawiam się, że mogę opublikować nieprawidłowe pytanie.
Test Set Up
minimalistyczny set up zawiera aplet zwracającą trochę Unicode (UTF-8) ciągi:
/* 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.
}
}
Odpowiednia strona internetowa ze skryptu java mógłby wyglądać następująco:
/* 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>
Środowisko
pracuję na Windows 7 32-bitowy z aktualną wersją Java 1.7.0_21 za pomocą "wtyczki Java nowej generacji 10.21.2 dla przeglądarek Mozilli". Miałem problemy z ustawieniami regionalnymi systemu operacyjnego, ale wypróbowałem kilka ustawień regionalnych (angielski, japoński, chiński).
W przypadku uszkodzonego łańcucha znaków String wyświetlane są nieprawidłowe znaki (np. ). Z drugiej strony, Firefox całkowicie upuszcza napis, jeśli kończy się na .
Eksplorator internetowy udaje się wyświetlić ciągi poprawnie.
Rozwiązania?
mogę sobie wyobrazić kilka obejścia, w tym ucieczce/unescaping i dodanie „ostatecznego char”, który następnie jest usuwany za pomocą skryptu java. Właściwie to zamierzam napisać przeciwko Webkitowi Androida i nie testowałem go tam.
Ponieważ chciałbym kontynuować badania w Chrome (ze względu na technologię Webkit i komfortu) Mam nadzieję, że to banalne rozwiązanie problemu, który mógłbym pominąć.
Jestem zainteresowany tym, jaki jest prawdziwy problem. Jednym z pomysłów, które znalazłem jest: upewnij się, że 'javac' i/lub' jar' używa kodowania UTF8 - jeśli go nie określisz, użyje domyślnej maszyny (która * może * być problemem). – Ian
Dzięki! Spróbuję tego później. Chcę zauważyć, że przepływ danych ze skryptu java do apletu (parametr wywołania) działa zgodnie z oczekiwaniami. Tylko zwrot zostaje zawalony. – Inuniku
Absolutnie. Pokazałeś/wyjaśniłeś, że wszystko działa poprawnie, z wyjątkiem ciągu zwracanego w specjalnych przypadkach (ostatni znak w zwróconym łańcuchu ma znak Unicode). Myślę, że bardzo dobrze wytłumaczyłeś sytuację i wszystko układałeś w bardzo uporządkowany sposób :) – Ian