読者です 読者をやめる 読者になる 読者になる

Re: jaencs.vim - KBDAHOLIC - やぬすさんとこ

vim

Vimエンコーディング周りはややこしすぎるというお話。

jaencs.vim - KBDAHOLIC - やぬすさんとこ

" use U+3327 "SQUARE TON" and U+3326 "SQUARE DORU"
let test_ms = iconv("\u3327\u3326", 'ucs-2', 'eucjp-ms')
let test_jisx = iconv("\u3327\u3326", 'ucs-2', 'euc-jisx0213')

http://github.com/januswel/dotfiles/blob/6f0a2bfe34a0980ab7422590da0d1c610fa19ca7/vimfiles/plugin/jaencs.vim#L48

まず、\u は 'encoding' の値に依存するのでこの場合は不適切。

\u.... character specified with up to 4 hex numbers, stored according to the
current value of 'encoding' (e.g., "\u02a4")

:help expr-quote

\u は Unicode だろJKという常識は Vim には通用しません!

次に、Vim は実装の都合上内部の文字列表現にNUL文字を使えない。なので、Unicode系のエンコーディングは全て UTF-8 として扱ってしまう。

Note that Vim uses UTF-8 for all Unicode encodings, conversion
from/to UCS-2 is automatically changed to use UTF-8. You
cannot use UCS-2 in a string anyway, because of the NUL bytes.

:help iconv()

よって、ucs-2 を指定したつもりでも実際には utf-8 を指定していることに。

以上より今回の場合は以下のように書かないと環境によってはうまく動かない。

let test_ms = iconv("\xe3\x8c\xa7\xe3\x8c\xa6", 'utf-8', 'eucjp-ms')
let test_jisx = iconv("\xe3\x8c\xa7\xe3\x8c\xa6", 'utf-8', 'euc-jisx0213')

いやー相変わらず Vim はぶっ㌧㌦ね。