8

私はかなり新しいので、あまり厳しくしないでください:)

質問(tl;dr)

Web ページにString埋め込まれた Unicode を Java Script 部分に渡す際に問題に直面しています。javax.swing.JAppletこれがバグなのか、関連するテクノロジーの誤解なのかはわかりません。

問題

Java アプレットから Java Script に Unicode 文字列を渡したいのですが、文字列がめちゃくちゃになってしまいます。不思議なことに、 Internet Explorer 10では問題が発生せず、Chrome (v26)Firefox (v20) では問題が発生しません。ただし、他のブラウザはテストしていません。

返された文字列は、最後の Unicode 文字を除いて問題ないようです。Java Script Debugger と Web ページの結果は次のようになります。

  • 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 スクリプトを含む Web ページは、次のようになります。

 /* 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 テクノロジと快適さのため)、見落としていた可能性のある問題に対する簡単な解決策があることを願っています。

4

4 に答える 4

1

次の Java 引数をアプレット/埋め込みタグに追加する必要があります。

-Dfile.encoding=utf-8

すなわち、java_arguments="-Dfile.encoding=utf-8"

それ以外の場合は、アプレットを ASCII テキストとして想定して扱います。

于 2013-05-31T10:01:08.480 に答える
0

さて、私はそれを十分に試したと思ったので、少し恥ずかしいです.私は実際にはラテン語以外のロケールを使用していました(たとえば、Windowsのシステムロケール設定で中国語(PRC)または日本語(日本))英語 (USA)またはドイツ語 (ドイツ) のすべてが期待どおりに機能しました。

Java と最新のブラウザーは Unicode ベースである必要があるため、なぜ Chrome と Mozilla にこのような奇妙な影響を与えるのか、まだ疑問に思っています。だから私はこれを答えとして受け入れません!日本語に戻すと問題が再発するので、別のシステムでテストします。

啓発的な意見を寄せてくださったすべてのポスターに感謝したいと思います...そして、この問題を解決するためにまだ努力を続けています。

于 2013-05-08T20:13:47.340 に答える