繁体   English   中英

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

[英]Why does my Unicode String get corrupted, when passed from Java Applet to Java Script?

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

问题(tl;博士)

我面临将网页中的嵌入式javax.swing.JApplet的Unicode String传递到Java脚本部分的问题。 我不确定这是所涉及技术的错误还是误解:

问题

我想将unicode字符串从Java Applet传递给Java Script,但是字符串变得混乱了。 奇怪的是,不是在Internet Explorer 10中不会发生此问题,而是在Chrome(v26)Firefox(v20)中不会发生此问题。 我还没有测试其他浏览器。

返回的String看起来还可以,除了最后一个Unicode字符。 Java Script Debugger和Web Page中的结果将是:

  • abc→abc
  • 表示→表
  • ま→ま
  • →ッチリスト→ウォッチリス
  • アップロード→アップロー
  • ホ→
  • ホ→ホ(不确定)
  • アップロード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>

环境

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

如果字符串损坏,镶边会显示无效字符(例如 )。 另一方面,如果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具有重要价值。

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

我建议在

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/zh-CN/docs/DOM/window.escape (不属于任何标准)

https://developer.mozilla.org/zh-CN/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命令可以显示file的编码。

看到

http://linux.die.net/man/1/file (尚未找到kernel.org手册参考)

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

-Dfile.encoding = utf-8

即java_arguments =“-Dfile.encoding = utf-8”

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

好的,我有点尴尬,因为我想我已经足够尝试了:我实际上是在Windows的系统语言环境设置中使用非拉丁语言环境(例如Chinese(PRC)Japanese(日本))英语(美国)德语(德国)一切正常。

我仍然想知道,为什么它会以一种奇怪的方式影响Chrome和Mozilla,因为Java和现代浏览器应该基于unicode; 所以我不会接受这个答案! 通过切换回日语再次出现该问题,我将在不同的系统上进行测试。

我要感谢所有张贴者的启发性输入……我将继续努力解决这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM