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コードポイントに変換されません。
UTF-8コード値ではなくUnicodeコードポイントが表示されるのはなぜですか?
ga
を使用するため:
<”> 8221, Hex 201d, Octal 20035
の代わりに g8
:
e2 80 9d
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文字を削除します。