我很新,所以不要太苛刻:)
问题(tl;博士)
我在String
将嵌入javax.swing.JApplet
网页中的 unicode 传递到 Java Script 部分时遇到问题。我不确定这是错误还是对所涉及技术的误解:
问题
我想将一个 unicode 字符串从 Java Applet 传递给 Java Script,但是字符串被弄乱了。奇怪的是,问题并没有出现在Internet Explorer 10中,而是出现在Chrome (v26)和Firefox (v20)中。不过我还没有测试过其他浏览器。
返回的字符串似乎没问题,除了最后一个 unicode 字符。Java 脚本调试器和网页中的结果将是:
- abc → abc
- 表示→表��</li>
- ま → ま</li>
- ウォッチリスト → ウォッチリスト
- アップロード → アップロード</li>
- ホ → ��
- ホ → ホ(不确定)
- アップロード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>
环境
我正在使用“用于 Mozilla 浏览器的下一代 Java 插件 10.21.2”在当前 Java 版本 1.7.0_21 的 Windows 7 32 位上工作。我的操作系统区域设置存在一些问题,但我尝试了几种(英语、日语、中文)区域设置。
如果字符串损坏,chrome 会显示无效字符(例如 ��)。另一方面,如果字符串以 �� 结尾,Firefox 会完全删除该字符串。
Internet Explorer 设法正确显示字符串。
解决方案?
我可以想象几种解决方法,包括转义/取消转义和添加一个“最终字符”,然后通过 java 脚本将其删除。实际上,我打算针对 Android 的 Webkit 进行编写,但我还没有在那里测试过。
由于我想继续在 Chrome 中进行测试,(因为 Webkit 技术和舒适性)我希望有一个简单的解决方案来解决我可能忽略的问题。