当我将字符串从Javascript传递到Java applet时,字符串会发生奇怪的变化

Strings are changed strangely when I pass a string from Javascript to Java applet

本文关键字:字符串 变化 Java Javascript applet      更新时间:2023-09-26

我正在使用Javascript和Java applet(用于套接字)制作web IRC客户端。我以前用过Flash,但由于它有严格的安全限制,它可以连接的服务器受到限制。于是我开始使用Java applet,这是我以前没有使用过的,所以我遇到了很多问题,如使用<applet>,编译applet,签名jar.),我有一个奇怪的现象。

当字符串从Javascript传递到Java applet(如irc.sendLine("foobar"))时,有时代码为65533(�)127的字符,有时其他内容如110或ASCII (()中的数字被填充。这可能是编码问题,但我认为它不是,因为Java和HTML页面中使用的字符集都是UTF-8,甚至当字符串仅由字母数字组成时也会发生这种情况。

更奇怪的是,它只发生在谷歌浏览器。在Firefox中,没有填充(这是可以的)

我修改了Java applet代码来调试这个问题。

下面是我的一部分代码(traceStr打印字符串到Javascript控制台)

public void sendLine(String s){
    traceStr(dumpStr(s));
}
private String dumpStr(String s){
    String result = "";
    for(int i=0;i<s.length();i++){
       result += s.codePointAt(i);
        if(i<s.length()-1) result += " ";
    }
    return result;
}

sendLine使用JS控制台调用,如irc.sendLine("foobar")

下面是一些输出(重复添加0)

48 40 65533
48 48 65533 65533 65533 127
48 48 48 65533 65533 127
48 48 48 48 65533 127
48 48 48 48 48 127
48 48 48 48 48 48
48 48 48 48 48 48 48
48 48 48 48 48 48 48 48
48 48 48 48 48 48 48 48 48
48 48 48 48 48 48 48 48 48 48
48 48 48 48 48 48 48 48 48 48 48
48 48 48 48 48 48 48 48 48 48 48 48
48 48 48 48 48 48 48 48 48 48 48 48 48
48 48 48 48 48 48 48 48 48 48 48 48 48 48
48 48 48 48 48 48 48 48 48 48 48 48 48 48 48
48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 99 111 110 110 101 99 116
48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 65533 65533 65533
48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 65533 65533 65533 127
48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 65533 65533 127
48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 65533 127
48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 127

The quick brown fox的输出:

84 104 101 32 113 117 105 99 107 32 98 114 111 119 110 32 102 111 120 65533 65533 127

天1天11天111天地的输出:

22825 65533 65533 127
22825 49 65533 127
22825 49 49 127
22825 49 49 49
22825 22320

我在Ubuntu 11.10上使用Google Chrome 17.0.932.0和Java 1.6.0_23。当我使用Flash时,这种情况不会发生。谁能指出我做错了什么吗?从输出我猜有一些错误的UTF-8,但我不知道了…

顺便说一句,我在SO上发现的许多问题的答案都提到了ISO-8859-1,但它与这个问题有关吗?

JavaScript是UTF-16。因此,从UTF-16转换到UTF-8可能会产生意想不到的副作用。