30

—EM ダッシュ (またはHTML)を含む ASCII ファイルがあります。16 進値は 0x97 です。このファイルを 1 つのアプリケーションに渡すと、UTF-8 として到着し、文字を—HTML の 0xC297 に変換します。ただし、このファイルを別のアプリケーションに渡すと、文字が 0xE28094 または—.

これらのアプリケーションがこれらの文字を異なる方法で変換する原因は何ですか? おそらくコードページの設定ですか?

4

4 に答える 4

39

— 間違っている。数字参照を使用する場合、数字は 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 の世界では「エンコードされたテキスト」を意味するものとして定着しています。現在のシステム デフォルト コード ページで」)。

于 2009-03-10T17:51:55.493 に答える
18
  • —は em ダッシュではありません。あなたのテキストは em ダッシュからその値に誤って翻訳されました。
  • —全角ダッシュの HTML 10 進数エンティティです。具体的には、全角ダッシュを表す Unicode コード ポイント 8212 を参照しています。
  • em ダッシュが含まれている場合、ファイルは ASCII ではありません。ASCII 文字は 0 から 127 の 10 進数の範囲にのみエンコードされ、em ダッシュは ASCII エンコードで表現できる文字ではありません。em ダッシュが 0x97 (10 進数で 151) として保存されている場合は、おそらく ANSI テキスト ファイル (別名 Windows Codepage 1252 (w-1252)) を持っています。

あなたの最初のアプリ...
データは、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 になります。

基本的に、アプリがテキストに触れるたびに、テキストがどのようにエンコードされているかを伝える必要があります。そうしないと、システムのデフォルトにフォールバックする可能性があります。その場合、データが破損する危険があります。

于 2010-01-07T12:36:50.237 に答える
6

HTML4仕様の文字エンティティ参照によると、emdashは—です。(U + 2014)。

于 2009-03-10T17:32:07.740 に答える
5

ASCII文字セットの範囲は0x00から0x7Fのみであるため、ASCIIファイルに文字0x97を含めることはできません。したがって、ファイルはASCIIではなく、他の1バイトエンコーディングです。たとえば、windows-1250エンコーディングでは、0x97にem-dashがあります。

アプリケーションがファイルの作成に使用されたもの以外のエンコーディングを使用してテキストファイルをデコードする場合、0x7Fを超える文字はすべて間違っています。

Unicodeでは、em-dashの文字コードは0x2014、つまり10進数で8212です。

Unicode文字'EMDASH'(U + 2014)

たとえば、エンコーディングとして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>&#151;</div>
</body>
</html>
于 2009-03-10T17:37:47.413 に答える