8

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

问题(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 技术和舒适性)我希望有一个简单的解决方案来解决我可能忽略的问题。

4

4 回答 4

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 或 Cygwinfile命令可以显示文件的编码。

http://linux.die.net/man/1/file(还没有找到 kernel.org 的 man 参考)

于 2013-05-08T10:12:34.520 回答
1

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

-Dfile.encoding=utf-8

即 java_arguments="-Dfile.encoding=utf-8"

否则,它将期望小程序并将其视为 ASCII 文本。

于 2013-05-31T10:01:08.480 回答
1

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

请用这个替换第一行然后测试它,

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

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

过渡/松开它可以与 Unicode 一起使用的类型。请测试并回复..

于 2013-05-08T09:10:40.330 回答
0

好吧,我有点尴尬,因为我认为我已经足够尝试了:我实际上是在 Windows 的系统区域设置中使用非拉丁语言环境(例如中文(PRC)日语(日本)。当我改回英语(美国)德语(德国)一切都按预期工作。

我还在想,为什么它会以如此奇怪的方式影响 Chrome 和 Mozilla,因为 Java 和现代浏览器应该是基于 unicode 的;所以我不会接受这个作为答案!切换回日语后问题再次出现,我将在不同的系统上对其进行测试。

我要感谢所有海报的启发性意见......我仍然会努力解决这个问题。

于 2013-05-08T20:13:47.340 回答