私はかなり新しいので、あまり厳しくしないでください:)
質問(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 テクノロジと快適さのため)、見落としていた可能性のある問題に対する簡単な解決策があることを願っています。