EM Dash#151の違いは何ですか。および#8212 ;?
質問
EMダッシュを含むASCIIファイル(-またはHTMLの& mdash;
)があります。 16進値は0x97です。このファイルを1つのアプリケーションに渡すと、UTF-8として到着し、文字を0xC297(HTMLの—
)に変換します。ただし、このファイルを別のアプリケーションに渡すと、文字が0xE28094または—
に変換されます。
これらのアプリケーションがこれらの文字を異なる方法で変換する原因は何ですか?おそらくコードページ設定ですか?
解決
—間違っている。数字参照を使用する場合、数字はUnicodeコードポイントを参照します。 256未満の数値の場合、ISO-8859-1のコードポイントと同じです。 8859-1では、文字151は“ C1制御コード”の中にあり、ダッシュやその他の目に見える文字ではありません。
Windowsコードページ1252(西ヨーロッパ言語)では文字151がダッシュであるため、混乱が生じます。多くの人はcp1252はISO-8859-1と同じものだと考えていますが、実際にはそうではありません。C1範囲(128〜159)の文字は異なります。
最初のアプリケーションは、“ ASCII”を読み取っていますfile *をISO-8859-1としますが、実際はおそらくcp1252であり、アプリがどのエンコードを想定しているのかを知る手掛かりが必要になります。
(*:“ ASCII”は、ファイルに最上位ビットセットの文字が含まれている場合は誤った名前です。おそらく“ ANSI”を意味します。現在のシステムのデフォルトコードページでエンコードされたテキストを意味するためにWindowsの世界にこだわっているもの”)
他のヒント
-
—
はem dash の場合、テキストはem dashからその値に誤って翻訳されています。 -
—
はem dashのHTML 10進数エンティティです。具体的には、emダッシュを表すUnicodeコードポイント8212を参照しています。 - emダッシュを含むファイルはASCIIではありません。 ASCII文字は10進数の範囲0-127にのみエンコードされ、em dashはASCIIエンコードで表現できる文字ではありません。 emダッシュが0x97(10進数で151)として保存されている場合、おそらくANSIテキストファイル(別名Windowsコードページ1252(w-1252))があります。
最初のアプリ...
データは、w-1252でエンコードされたemダッシュとして開始されました。 w-1252では、emダッシュは10進値151(16進では0x97、2進では10010111)にマップされます。
ある時点でemダッシュは、ファイル内のバイトがiso-8859-1でエンコードされたテキストであると考えるコードによって処理されました。そのコードが0x97を文字列/文字として解釈したとき、 0x97をiso-8859-1エンコーディングに従った文字。 iso-8859-1では、0x97はchar「保護領域の終わり」にマップされます。
次に、コードが「保護領域の終わり」と考える文字列。制御文字。utf-8としてエンコードされました。 "保護区域の終わり" utf-8でエンコードされるのは、2バイトのシーケンスです:0xC2 0x97 。
2番目のアプリ...
テキストファイルはw-1252として正しく解釈されたため、0x97はemダッシュとして認識され、utf-8でemダッシュとして正しくエンコードされました:0xE2 0x80 0x94。
この動作に影響を与えるもの
あなたがウェブアプリを扱っているのか、それとも何を扱っているのかはわかりませんが、コンセプトは何であれ同じでなければなりません。ユーザーがフォームにデータを入力するWebアプリでも、同じ0x97-> 0xC297のシナリオがありました。 Webページの文字セットはiso8859-1として宣言されており、ブラウザのw1252文字を処理する最善の方法は、ユーザーまたはサーバーに警告せずにisoバイトとして送信することでした。サーバーは、isoと見なしたデータを受信し、utf-8に変換して、0xC297になります。
基本的に、アプリがテキストに触れるたびに、テキストのエンコード方法を通知する必要があります。そうしないと、システムのデフォルトにフォールバックする可能性があります。その場合、データが破損する危険があります。
HTML4仕様の文字エンティティリファレンス 、emdashは—です。 ( U + 2014 )。
ASCIIファイルには文字0x97を含めることはできません。ASCII文字セットの範囲は0x00〜0x7Fのみであるためです。したがって、ファイルはASCIIではなく、他のシングルバイトエンコーディングです。たとえば、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>