我很新,所以不要太苛刻:)
我在将一个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中的结果是:
字符串似乎在最后的字节中被破坏了。如果它以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 */
<!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>
我使用“适用于Mozilla浏览器的下一代Java插件10.21.2”,使用当前的Java版本1.7.0_21处理Windows 7 32位。我的操作系统区域设置存在一些问题,但我尝试了几种(英语,日语,中文)区域设置。
如果损坏,String chrome会显示无效字符(例如 )。另一方面,Firefox会完全丢弃字符串,如果它以 结尾。
Internet Explorer设法正确显示字符串。
我可以想象几种解决方法,包括转义/取消转义和添加“最终字符”,然后通过java脚本删除。实际上我打算用Android的Webkit编写,我还没有在那里测试过。
由于我想继续在Chrome中进行测试(因为Webkit技术和舒适性),我希望这个问题有一个简单的解决方案,我可能会忽略它。
答案 0 :(得分:1)
如果您在Chrome / Firefox中进行测试
请用此替换第一行,然后进行测试,
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
当浏览器识别页面时,Doctype具有重要价值。
过渡/松散可以使用Unicode的类型。请测试并回复..
答案 1 :(得分: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(不属于任何标准的一部分)
和
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 man引用)
答案 2 :(得分:1)
您需要确保将以下Java参数添加到applet / embed标记:
-Dfile.encoding = UTF-8
即。 java_arguments = “ - 指定-Dfile.encoding = UTF-8”
否则它会期望并将applet视为ASCII文本。
答案 3 :(得分:0)
好吧,我有点尴尬,因为我认为我已经尝试了很多:我实际上使用非拉丁语语言环境(例如中文(PRC)或日语(日本) 在Windows系统中locale settings。当我改回英语(美国)或德语(德国)时,一切都按照要求进行。
我仍在疑惑,为什么它会影响Chrome&amp; Mozilla以这种奇怪的方式,因为Java和现代浏览器应该是基于unicode的;所以我不接受这个作为答案!通过切换回日语重新出现问题,我将在不同的系统上测试它。
我要感谢所有关于启发投入的海报......我仍然会努力解决这个问题。