web-dev-qa-db-ja.com

VIMがUTF-8コード値ではなくUnicodeコードポイントを表示するのはなぜですか?

PHPブログで見つけたこの想定されるコード行を考えてみてください。引用符に注意してください。

throw new Exception(“That's not a server name!”);

これらの引用符は RIGHT DOUBLE QUOTATION MARK (Unicode code point:U+201D; UTF-8 16進エンコード値:0xE2 0x80 0x9D)です。押す ga VIMでは、ステータスバーに次のように表示されます。

<”> 8221, Hex 201d, Octal 20035

UTF-8コード値ではなくUnicodeコードポイントが表示されるのはなぜですか?

ファイルがUTF-8として保存されており、バイトをグリフに変換するのはterminalであることを考えると、VIMはファイルの生の値(UTF-8コード値)。Unicodeコードポイントに変換されません。

8
dotancohen

UTF-8コード値ではなくUnicodeコードポイントが表示されるのはなぜですか?

gaを使用するため:

<”> 8221, Hex 201d, Octal 20035

の代わりに g8

e2 80 9d
17
romainl

Vimはテキストエディタであり、テキストコードポイントで動作するため、notバイトです。発生する変換は複数あります。ファイルを開くとき、エディターはファイルをバイトエンコーディングから内部表現(通常はUnicode)にデコードする必要があります。ファイルに保存するとき、またはその内容を端末に表示するとき、エディターはテキストをバイトにエンコードして戻す必要があります。

この理由の1つは単純です。ファイルと端末は、different文字セットを使用している可能性があります。たとえば、ISO 8859-13またはKOI8-Rで古いドキュメントを編集していて、それらをUTF-8端末に正しく表示したいとします。

2つ目の理由は、テキストエディタがテキストを処理することです。例えば、 は、バイトエンコーディング(UTF-8では3バイト、Windows-1257では1バイト、Shift-JISでは2バイトなど)に関係なく、1文字で、幅は1つのターミナルセルです。 Vimがそれを3バイトとして数えただけで、端末が1として表示した場合、垂直方向の分割がずれたり、行が早すぎたり、タブが狭すぎたりするなどの結果になります。

Instead of this...                ...you would see this.

┌───────────────────────────┐     ┌───────────────────────────┐
│She said, "Hello."         │     │She said, "Hello."         │
│                           │     │                           │
│She said, “Hello.”         │     │She said, “Hello.”     │
│                           │     │                           │
│Ji pasakė, „Sveiki“.       │     │Ji pasakė, „Sveiki“. │
└───────────────────────────┘     └───────────────────────────┘

言うまでもなく、あなたはしなければならないでしょう Backspace3回1文字を削除します。

13
user1686