为什么我的unicode字符串遭到损坏,从Java小程序传递给Java脚本的时候?(Why does

2019-09-01 21:18发布

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

问(TL; DR)

我现在面临传递一个统一的问题String从嵌入式javax.swing.JApplet在网页中的Java脚本的一部分。 我不知道这是否是一个错误或涉及到的技术的一个误区:

问题

我想从一个Java小程序Java脚本传递的Unicode字符串,但字符串被搞砸。 奇怪的是,并没有在Internet Explorer 10,但在Chrome(V26)Firefox(V20)不会出现此问题。 我没有测试但其他浏览器。

返回的字符串似乎不错,除了最后Unicode字符。 在Java脚本调试器和Web页面的搜索结果将是:

  • 美国广播公司ABC→
  • 查看→表
  • 或→或
  • 监视列表→观察名单
  • 上传→低了
  • Ë→
  • Ë→E(不确定性)
  • 上传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 */
<!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>

环境

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

在一个腐败字符串铬的情况下,示出了无效字符(例如)。 火狐,而另一方面,完全地丢弃字符串,它是否会与即将结束。

Internet Explorer的管理,才能正确显示字符串。

解决方案?

我可以想像几个解决方法,包括转义/转义并加入其中,然后通过Java脚本,删除了“最后的字符”。 其实,我打算写对Android的WebKit的,和我没有测试它。

因为我想继续在Chrome测试,我希望有一个简单的解决问题的办法,我可能都忽略了(因为Webkit的技术和舒适性)。

Answer 1:

如果您在Chrome / Firefox中测试

请更换第一行与此并对其进行测试,

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

文档类型有显著的价值,同时浏览器标识的页面。

过渡/松它,你可以使用Unicode使用的类型。 请测试和回复..



Answer 2:

我建议设置一个断点上

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人参考)



Answer 3:

您需要确保以下Java参数添加到您的小程序/嵌入标签:

-Dfile.encoding = UTF-8

即java_arguments = “ - 指定-Dfile.encoding = UTF-8”

否则,它会期待和对待小程序为ASCII文本。



Answer 4:

好吧,我是一个有点尴尬,因为我觉得我试了一下就够了:实际上,我是使用非拉丁语言环境(例如, 中文(中国)日本(日本)在Windows的系统区域设置当我改回。 英语(美国)德国(德国),一切都按excpected。

我一直在想,为什么它会影响到Chrome浏览器和Mozilla的这样一种奇怪的方式,因为Java和现代的浏览器应该是基于Unicode的; 所以,我不会接受这个作为一个答案! 问题切换回日本再次发生,我要测试它在不同的系统。

我要感谢所有的海报为enlightning输入...我还是会放一些精力在解决这个问题。



文章来源: Why does my Unicode String get corrupted, when passed from Java Applet to Java Script?