2

以下のように、Javaからtest.jsを作成しています。Test.jsは、パラメーターとして特殊文字〜('\ u0098');を受け取る関数d()を実装します。

関数d()は、この特殊文字のcharCodeAt()、つまり152を表示する必要があります。ただし、732を表示します。

以下のように、文字152と732は両方とも特殊文字〜で表されることに注意してください。

http://www.fileformat.info/info/unicode/char/098/index.htm

http://www.fileformat.info/info/unicode/char/2dc/index.htm

関数d()に732ではなく152を表示させるにはどうすればよいですか?(文字セットの問題?)。ありがとう

TEST.JAVA

public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
    res.setHeader("Content-Type", "text/javascript;charset=ISO-8859-1");
    res.setHeader("Content-Disposition","attachment;filename=test.js");
    res.setCharacterEncoding("ISO-8859-1");
    PrintWriter printer=res.getWriter();
    printer.write("function d(a){a=(a+\"\").split(\"\");alert(a[0].charCodeAt(0));};d(\""); // Writes beginning of d() function
    printer.write('\u0098'); // Writes special character as parameter of d()
    printer.write("\");"); // Writes end of d() function
    printer.close();
}

TEST.JAVAによって作成されたTEST.JS

function d(a)
{
  a=(a+"").split("");
  alert(a[0].charCodeAt(0));
};
d("˜"); // Note special character representing '\u0098'

TEST.HTML

<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<script type="text/javascript" charset="ISO-8859-1" src="test.js"></script>
</body>
</html>
4

2 に答える 2

4

以下のように、文字 152 と 732 は両方とも特殊文字 ~ で表されることに注意してください。

あまり。˜は間違いなく U+02DC (732) のキャラクターなのでcharCodeAt、正しいことをしています。文字 U+0098 (152) は、ほとんど使用されない目に見えない制御コードです。

秘訣は、"ISO-8859-1"Java と Web ブラウザーでは意味が異なることです。Java の場合、実際には ISO-8859-1 標準であり、Unicode の最初の 256 コード ポイントに正確に対応しています。これには、128 ~ 159 のほとんど使用されていない一連の C1 制御文字が含まれます。

ただし、Web ブラウザーの場合、"ISO-8859-1"実際には Windows コード ページ 1252 (西ヨーロッパ言語) を意味し、さまざまな有用な文字を代わりに 128 ~ 159 ブロックに配置するエンコーディングです。この動作は、マシンの既定のコード ページを使用した初期の Web ブラウザーに起因します。適切な Unicode とエンコーディングのサポートがブラウザーに追加されたとき、ISO-8859 形式としての誤ったラベル付けにもかかわらず、互換性の問題により、Windows 文字の継続的なサポートが決定されました。

したがって、ISO-8859-1 で Java から U+0098 文字を書き込むと、0x98 バイトが取得され、ブラウザによって U+02DC として読み込まれます。U+0080 ~ U+009F の範囲の C1 制御コードを実際に使用する人はいないため、これは通常は無害です。しかし、紛らわしいのは確かです。

&#...;この古くからの癖は、 128 ~ 159 の範囲の文字参照を cp1252 バイトとして扱うという関連する癖とともに、最終的に文書化され、HTML5 の一部として標準化されましたが、HTML 解析規則のみが対象です。(より賢明な XML 規則に従うため、XHTML5 ではありません。) これが、引用された fileformat.info ページが、誤解を招くように、U+0098 が のようにレンダリングされると言っているように見える˜理由です。

文字のcp1252バイト番号を抽出する必要がある場合は、その情報が JavaScript に表示されないため、ルックアップ テーブルを使用する必要があります。例えば:

var CP1252EXTRAS= '\u20ac\u20ac\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0160\u2039\u0152\u0152\u017d\u017d\u017d\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\u0161\u203a\u0153\u0153\u017e\u0178';

function getCodePage1252Byte(s) {
    var ix= CP1252EXTRAS.indexOf(s);
    if (ix!==-1)
        return 128+ix;
    var c= s.charCodeAt(0);
    if (c<128 || c>=160 && c<256)
        return c;
    return -1;
}

あなたはおそらくそれをしたくないでしょう。とにかく、通常、答えは ISO-8859-1 を使用せず、古き良き UTF-8 (The Only Sensible Encoding™) に固執することです。

いずれにせよ、<script charset="...">すべてのブラウザーでサポートされているわけではなく、すべてのブラウザーでサポートされているContent-Type: text/javascript;charset=...わけでもありません。含まれるページとは異なるエンコーディングで JavaScript を提供する信頼できる方法はありません。すべてのインクルード ページがスクリプトと同じエンコーディングを使用する 100% ではない場合、唯一の安全な方法は、JavaScript を ASCII セーフに保ち、\unnnnリテラル バイトではなく JavaScript シーケンスを出力することです。

(ASCII 互換の JSON エンコーダーがこれを行うのに役立つ場合があります。)

于 2012-04-09T23:59:09.660 に答える
0

試す:

    printer.write('\\u0098');

JavaScriptも理解できる\uNNNNので、必要な文字コードを使用して文字列を明示的に形成できます。

于 2012-04-09T22:22:51.087 に答える