我很新,所以不要太苛刻:)從Java Applet傳遞到Java Script時,爲什麼我的Unicode字符串會被破壞?
問題(TL; DR)
我面對從嵌入式javax.swing.JApplet
在網頁中傳遞一個統一String
的一個問題Java腳本部分。我不知道這是一個錯誤或涉及到的技術的誤解是否:
問題
我想從一個Java小程序Java腳本傳遞的Unicode字符串,但字符串被搞砸。奇怪的是,這個問題不會發生在Internet Explorer 10,但在Chrome(v26)和Firefox(v20)。我還沒有測試過其他瀏覽器。
返回的字符串似乎沒問題,除了最後一個Unicode字符。在Java腳本調試器和Web頁面的結果將是:
- ABC→ABC
- 表示→表
- ま→ま
- ウォッチリスト→ウォッチリス
- アップロード→アップロー
- ホ→
- ホ→ホ(不確定)
- アップロードABC→アップロードABC
的字符串似乎得到在最後字節損壞。如果以ASCII字符結尾,則字符串可以。此外,問題不會發生在每個組合中,也不是每次都會發生(對此不確定)。因此我懷疑有一個錯誤,恐怕我可能會發佈一個無效的問題。
測試設置
簡約設立包括返回某些Unicode(UTF-8)的字符串的小程序:
/* 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.
}
}
與Java腳本對應的網頁看起來是這樣的:
/* 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>
環境
我工作在Windows 7 32位目前的Java版本1.7.0_21使用「用於Mozilla瀏覽器的下一代Java Plug-in 10.21.2」。我在操作系統語言環境中遇到了一些問題,但我嘗試了幾種(英文,日文,中文)區域設置。
在損壞的情況下字符串鉻顯示無效字符(例如 )。另一方面,Firefox會完全刪除字符串,如果它將以ending結尾。
Internet Explorer管理正確顯示字符串。
解決方案?
我可以想象幾種解決方法,包括轉義/ unescaping和添加一個「最終字符」,然後通過Java腳本刪除。其實我打算寫Android的Webkit,我沒有在那裏測試過。由於我想繼續在Chrome中進行測試,(因爲Webkit技術和舒適度),我希望這個問題有一個微不足道的解決方案,我可能忽略了這個問題。
我對什麼是真正的問題感興趣。我發現的一個想法是:確保'javac'和/或'jar'使用UTF8編碼 - 如果你沒有指定它,它會使用機器默認值(這可能是一個問題) – Ian 2013-05-03 15:21:23
謝謝!我稍後會嘗試。我想指出的是,從java腳本到applet(調用參數)的數據流按預期工作。只有回報變得混亂。 – Inuniku 2013-05-03 15:31:46
當然。你顯示/解釋了它一切正常,除了在特殊情況下返回的字符串(返回字符串中的最後一個字符具有unicode字符)。我認爲你解釋的情況非常好,並以非常有組織的方式展示了一切:) – Ian 2013-05-03 15:44:45