java - 为什么我的 Unicode 字符串在从 Java Applet 传递到 Java Script 时会损坏?

标签 java javascript unicode utf-8 applet

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

问题(tl;dr)

我在将 unicode String 从网页中嵌入的 javax.swing.JApplet 传递到 Java Script 部分时遇到问题。我不确定这是错误还是对所涉及技术的误解:

问题

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

返回的字符串似乎没问题,除了最后一个 unicode 字符。 Java 脚本调试器和网页中的结果将是:

  • 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>

环境

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

如果字符串损坏,chrome 会显示无效字符(例如 ��)。另一方面,如果字符串以 �� 结尾,Firefox 会完全删除该字符串。

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

解决方案?

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

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

最佳答案

如果您在 Chrome/Firefox 中测试

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

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

Doctype 在浏览器识别页面时具有重要的值(value)。

过渡性的/放宽您可以与 Unicode 一起使用的类型。请测试并回复..

关于java - 为什么我的 Unicode 字符串在从 Java Applet 传递到 Java Script 时会损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16359953/

相关文章:

java - 将 Hibernate 4.3 迁移到 5.2 - 缺少表

javascript - 单元测试: Having trouble mocking a promise return to test my emit

javascript - 更改前置文件输入的位置

javascript - Marionette.js 动态更改模板,requireJS 不起作用

.net - 如何规范 .NET 和 Mono OSX 之间的变音符号字符串表示形式?

c++ - 将 stringstream 传递到 unicode 项目中的控制台输出

java - Android 是否运行修改后的 Java 机器?

Java - PaintComponent 不会在 JPanel 上显示绘图

php - 图像 URL 中的 unicode 字符 - 404

java - 为什么我的堆栈溢出错误会在 518669 之后发生?