3 に答える
Re: あなたの最終的な観察 - Java バイトは常に署名されています。それらを unsigned として解釈するには、int でビット単位の AND を取ることができます。
byte[] bytes = "”".getBytes("UTF-8");
for(byte b: bytes)
{
System.out.println(b & 0xFF);
}
出力:
226
128
157
文字列は実際には UTF-8 で 3 バイトの長さに注意してください。
コメントで指摘されているように、エンコーディングに依存します。UTF-16 の場合は次のようになります。
254
255
32
29
US-ASCII または ISO-8859-1 の場合は、
63
これは疑問符です (つまり、「わからない、新しいキャラクター」)。次の点に注意してください。
getBytes()
この文字列を特定の文字セットでエンコードできない場合のこのメソッド [ ] の動作は規定されていません。エンコーディング プロセスをより詳細に制御する必要がある場合は、CharsetEncoder クラスを使用する必要があります。
次のように文字コードを印刷する方が良いと思います。
System.out.println((int)'”');//result is 8221
このリンクは、この異常な二重引用符 (html コードを含む) を説明するのに役立ちます。
HTML ドキュメントで文字を正しく表示することに関する質問に答えるには、ドキュメントのエンコーディングを設定するか、ASCII 以外の文字をエンティティ化するかのいずれかを行う必要があります。
エンコーディングを設定するには、2 つのオプションがあります。
- Web サーバーを更新して、Content-Type ヘッダーで適切な文字セット引数を送信します。正しいヘッダーは
Content-Type: text/html; charset=UTF-8
. <meta charset="UTF-8" />
ページの head セクションにタグを追加します。
オプション 1 はオプション 2 よりも優先されることに注意してください。つまり、ヘッダーに誤った文字セットを既に設定している場合、メタ タグで上書きすることはできません。
もう 1 つのオプションは、非 ASCII 文字をエンティティ化することです。”
質問の引用文字には、または”
またはを使用できます”
。1 つ目はユーザー フレンドリな名前付きエンティティで、2 つ目は文字の Unicode コード ポイントを 10 進数で指定し、3 つ目はコード ポイントを 16 進数で指定します。すべて有効で、すべて機能します。
通常、未知の文字を含むデータベースから動的コンテンツをエンティティ化する場合は、127 を超える任意の文字を適切なコードに変換するメソッドを簡単に作成できるため、エンティティのコード ポイント バージョンを使用するのが最善です。点。
私が現在取り組んでいるシステムの 1 つは、実際にこの問題に遭遇しました。この問題では、UTF-8 ソースからデータを取得し、Content-Type ヘッダーを制御せずに HTML ページを提供する必要がありました。私たちは実際に、Java 文字のストリームをすべての非 ASCII 文字をエンティティに変換した ASCII エンコード バイト ストリームに変換できるカスタム Java Charset を作成することになりました。次に、その Charset を使用して出力ストリームを Writer にラップし、通常どおりすべてを出力します。Charset を正しく実装するにはいくつかの落とし穴がありますが、自分でエンコードを行うのは非常に簡単です。サロゲート ペアを正しく処理するようにしてください。