—
EM ダッシュ (またはHTML)を含む ASCII ファイルがあります。16 進値は 0x97 です。このファイルを 1 つのアプリケーションに渡すと、UTF-8 として到着し、文字を—
HTML の 0xC297 に変換します。ただし、このファイルを別のアプリケーションに渡すと、文字が 0xE28094 または—
.
これらのアプリケーションがこれらの文字を異なる方法で変換する原因は何ですか? おそらくコードページの設定ですか?
間違っている。数字参照を使用する場合、数字は Unicode コードポイントを参照します。ISO-8859-1 のコードポイントと同じ 256 未満の数値の場合。8859-1 では、文字 151 が「C1 制御コード」に含まれており、ダッシュやその他の目に見える文字ではありません。
文字 151 が Windows コード ページ 1252 (西ヨーロッパ言語) のダッシュであるため、混乱が生じます。多くの人は cp1252 は ISO-8859-1 と同じものだと考えていますが、実際にはそうではありません: C1 範囲 (128 から 159) の文字は異なります。
最初のアプリケーションは「ASCII」ファイル* を ISO-8859-1 として読み取りますが、実際にはおそらく cp1252 であり、アプリが期待するエンコードについて手がかりを得る方法が必要です。
(*: ファイルにトップビット セット文字がある場合、「ASCII」は誤称です。おそらく「ANSI」を意味しますが、これも実際には誤称ですが、Windows の世界では「エンコードされたテキスト」を意味するものとして定着しています。現在のシステム デフォルト コード ページで」)。
—
は em ダッシュではありません。あなたのテキストは em ダッシュからその値に誤って翻訳されました。—
全角ダッシュの HTML 10 進数エンティティです。具体的には、全角ダッシュを表す Unicode コード ポイント 8212 を参照しています。あなたの最初のアプリ...
データは、w-1252 でエンコードされた em ダッシュとして始まりました。w-1252 では、em ダッシュは 10 進数値 151 (16 進数では 0x97、2 進数では 10010111) にマップされます。
ある時点で、em ダッシュは、ファイル内のバイトが iso-8859-1 でエンコードされたテキストであると考えるコードによって処理されました。そのコードが 0x97 を文字列/文字として解釈すると、iso-8859-1 エンコーディングに従って 0x97 を文字にマッピングしました。iso-8859-1 では、0x97 が文字「保護された領域の終わり」にマップされます。
次に、コードが「保護された領域の終わり」制御文字であると考える文字列は、utf-8 としてエンコードされました。utf-8 でエンコードされた「保護された領域の終わり」は、2 バイト シーケンス: 0xC2 0x97です。
2 番目のアプリ...
テキスト ファイルは w-1252 として正しく解釈されたため、0x97 は全角ダッシュとして認識され、これは utf-8 で全角ダッシュとして正しくエンコードされました: 0xE2 0x80 0x94。
この動作に影響を与える
もの Web アプリケーションを扱っているのか、それとも何を扱っているのかはわかりませんが、コンセプトは同じであるべきです。人々がデータをフォームに入力する Web アプリで、同じ 0x97->0xC297 シナリオがありました。Web ページの文字セットが iso8859-1 として宣言されていることがわかりました。ブラウザが w1252 文字を処理する最善の方法は、ユーザーやサーバーに警告せずに iso バイトとして送信することでした。サーバーはデータを受信すると、それが iso であると認識して utf-8 に変換し、結果として 0xC297 になります。
基本的に、アプリがテキストに触れるたびに、テキストがどのようにエンコードされているかを伝える必要があります。そうしないと、システムのデフォルトにフォールバックする可能性があります。その場合、データが破損する危険があります。
HTML4仕様の文字エンティティ参照によると、emdashは—です。(U + 2014)。
ASCII文字セットの範囲は0x00から0x7Fのみであるため、ASCIIファイルに文字0x97を含めることはできません。したがって、ファイルはASCIIではなく、他の1バイトエンコーディングです。たとえば、windows-1250エンコーディングでは、0x97にem-dashがあります。
アプリケーションがファイルの作成に使用されたもの以外のエンコーディングを使用してテキストファイルをデコードする場合、0x7Fを超える文字はすべて間違っています。
Unicodeでは、em-dashの文字コードは0x2014、つまり10進数で8212です。
たとえば、エンコーディングとしてwindows-1250を使用するWebページでは、コード—
はem-dashとしてレンダリングされます。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>em-dash</title>
<meta http-equiv="content-type" content="text/html; charset=windows-1250"/>
</head>
<body>
<div>—</div>
</body>
</html>