2013-05-03 35 views
8

我很新,所以不要太苛刻:)從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技術和舒適度),我希望這個問題有一個微不足道的解決方案,我可能忽略了這個問題。

+2

我對什麼是真正的問題感興趣。我發現的一個想法是:確保'javac'和/或'jar'使用UTF8編碼 - 如果你沒有指定它,它會使用機器默認值(這可能是一個問題) – Ian 2013-05-03 15:21:23

+1

謝謝!我稍後會嘗試。我想指出的是,從java腳本到applet(調用參數)的數據流按預期工作。只有回報變得混亂。 – Inuniku 2013-05-03 15:31:46

+1

當然。你顯示/解釋了它一切正常,除了在特殊情況下返回的字符串(返回字符串中的最後一個字符具有unicode字符)。我認爲你解釋的情況非常好,並以非常有組織的方式展示了一切:) – Ian 2013-05-03 15:44:45

回答

1

如果您在Chrome測試/火狐

請更換第一行與此並對其進行測試,

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

文檔類型有顯著的價值,同時瀏覽器標識的頁面。

過渡/釋放它可以使用的Unicode類型。請測試和回覆..

+0

感謝您的意見!我已經嘗試過,但仍然沒有運氣。 – Inuniku 2013-05-08 19:47:13

+0

您可以發佈頁面的頁面/頁面生成後的頁面的html(如果生活),這將有助於進一步。 – MarmiK 2013-05-09 03:41:33

1

我建議設置

paragraphNode.innerHTML = text; 

一個斷點,並檢查它的文字在JavaScript控制檯,例如與

console.log(escape(text)); 

console.log(encodeURIComponent(text)); 

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)); 
} 

參見

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

https://developer.mozilla.org/en-US/docs/DOM/window.escape(這不是任何斯坦的一部分DARD)

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

或類似資源。

您的源文件可能不在您所假定的編碼中(UTF-8)。

的JavaScript假定UTF-16字符串:

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

Java也採用UTF-16:

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

的Linux或Cygwin的file命令可以告訴你你的文件的編碼。

http://linux.die.net/man/1/file(還沒有找到一個kernel.org人蔘考)

+0

非常感謝您的詳細解答!使用'encodeURI'函數,我能夠在chrome中輸出最終的「損壞」字節:它們似乎都以'%EF%BF%BD%EF%BF%BD%00'結束。不知道它是否是真正的特徵,因爲firefox根本沒有顯示損壞的字符串(在這種情況下,返回一個長度爲0的字符串)。事實上,我能夠解決我的操作系統的問題(請參閱我的尷尬答案)。但它仍然影響其他區域...也許問題仍然有效修改。 – Inuniku 2013-05-08 20:00:50

0

好吧,我有點尷尬,因爲我覺得我試了一下就夠了:實際上,我是使用非拉丁語區域(例如,g 中文(PRC)日文(日本)在windows系統中locale settings。當我改回英文(美國)德國(德國)一切工作都受到重視。

我仍然想知道,爲什麼它會以這樣一種奇怪的方式影響Chrome瀏覽器& Mozilla,因爲Java和現代瀏覽器應該基於unicode;所以我不會接受這個答案!問題通過切換回日語而重新出現,我將在不同的系統上測試它。

我想感謝所有海報的啓發輸入...我仍然會努力解決這個問題。

1

您需要確保以下Java參數添加到您的小程序/嵌入標籤:

-Dfile.encoding = UTF-8

即java_arguments =「 - 指定-Dfile.encoding = UTF-8 「

否則,它會預期並將小程序視爲ASCII文本。