当从Java Applet传递到Java Script时,为什么我的Unicode String会被破坏?

我很新,所以不要太苛刻:)

问(TL; DR)

我遇到一个问题,将unicode String从网页中的嵌入式javax.swing.JApplet传递到Java Script部分。 我不确定这是对相关技术的错误还是误解:

问题

我想将一个unicode字符串从Java Applet传递给Java Script,但是String搞砸了。 奇怪的是,问题不会发生在Internet Explorer 10中,而是发生在Chrome(v26)Firefox(v20)中 。 我没有测试过其他浏览器。

返回的String似乎没问题,除了最后一个unicode字符。 Java Script Debugger和Web Page中的结果将是:

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

该字符串似乎在最后的字节中被破坏。 如果它以ASCII字符结尾,那么字符串就可以了。 此外,问题不是在每个组合中发生,也不是每次都发生(不确定)。 因此我怀疑是一个错误,我担心我可能会发布一个无效的问题。

测试设置

简约设置包括一个返回一些unicode(UTF-8)字符串的applet:

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

环境

我正在使用当前Java版本1.7.0_21使用“适用于Mozilla浏览器的下一代Java插件10.21.2”开发Windows 7 32位。 我的操作系统区域设置有一些问题,但我尝试了几个(英语,日语,中文)区域设置。

在损坏的情况下,String chrome显示无效字符(例如 )。 另一方面,Firefox会完全丢弃字符串,如果它以 结尾。

Internet Explorer设法正确显示字符串。

解决方案?

我可以想象几种解决方法,包括转义/取消转义和添加“最终字符”,然后通过java脚本删除。 实际上我打算用Android的Webkit编写,我还没有在那里测试过。

由于我想继续在Chrome中进行测试(因为Webkit技术和舒适性),我希望这个问题有一个简单的解决方案,我可能会忽略它。

如果您在Chrome / Firefox中进行测试

请用此替换第一行,然后进行测试,

  

当浏览器识别页面时,Doctype具有重要价值。

过渡/松散可以使用Unicode的类型。 请测试并回复..

我建议设置一个断点

 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 (不属于任何标准)

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命令可以显示file的编码。

看到

http://linux.die.net/man/1/file (尚未找到kernel.org man参考)

您需要确保将以下Java参数添加到applet / embed标记:

-Dfile.encoding = UTF-8

即java_arguments =“ – Dfile.encoding = utf-8”

否则它会期望并将applet视为ASCII文本。

好吧,我有点尴尬,因为我认为我已经尝试了很多:我实际上在Windows的系统区域设置中使用非拉丁语区域设置(例如中文(PRC)日语(日本) 。当我改回到英语(美国)德语(德国)一切顺利。

我仍然在想,为什么它会以一种奇怪的方式影响Chrome和Mozilla,因为Java和现代浏览器应该是基于unicode的; 所以我不接受这个作为答案! 通过切换回日语重新出现问题,我将在不同的系统上测试它。

我要感谢所有海报的启发意见……我仍然会付出一些努力来解决这个问题。