New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
UTF-8化したKaoriYa版Vimで標準入力からUTF-8な文字列を読み込むと文字化けする #370
Comments
たしかどこかのissueにて観測済みですが、 ただデバッグは遅れそう。 |
fencs に utf-8 がないのが原因ではないでしょうか。 " UTF-8環境向けにfileencodingsを設定する
let value = s:enc_jisx. ','.s:enc_cp932. ','.s:enc_eucjp. ','.value おそらく末尾かどこかに、 ちなみに自ビルドのguess無し版だと 3. で直接ファイルを開く場合でも文字化けしました。 |
enc=utf-8 の場合は fencs に utf-8 が入ってるとマズイ/もしくはその必要はありません。 |
おっと。私の根拠のデータはちょっとズレてるね。申し訳ない。 でも enc=utf-8 なら fencsにutf-8 が不要なのは Vim の仕様です。 ただ別件ですが「だいたいなんにでもマッチしてしまう ucs2-le」がfencsに入ってる事のほうが問題かもしれません。 |
あー、ほんとだ。fencs に utf-8 付けてもだめでした。 |
ucs-2le/be → utf-8 の変換だと、Windowsでは(?) iconvは使っていないですよね? |
だからかも。何も考えずに数値変換だけするから、どんな入力でも変換できちゃって、 |
僕の手元の正しく読み込めない cp932 ファイルには壊れた文字があった… ++enc= で指定すると読めるのは謎。変換エラー無視するアレになってるのかな… |
|
エンコーディングとして UCS-2LE を明示的に指定した場合は別として、自動判定するのであればファイルサイズが2の倍数かどうかぐらいはチェックすべきかもしれませんね。 |
:set fencs-=ucs-2
:set fencs-=ucs-2le してからやるとセーフらしい。 |
標準入力から流し込まずにファイルで指定すれば化けないという発生条件についても、それで説明がつくのでしょうか?
で同じでした。 |
ファイルの場合は guess が働き、標準入力の場合は働かないのだろうと推測しています。
|
あ、そういう事だったんですね。了解しました。 |
いまわかってることをざっくり書いときます。guessは切った状態で試してます。
以下、ポイントになりそうなところを抜粋 fileio.c:1797
fileio.c:1828 /* If there is a trailing incomplete sequence move it to
* conv_rest[]. */
if (tail != NULL)
{
conv_restlen = (int)((ptr + size) - tail);
mch_memmove(conv_rest, (char_u *)tail, conv_restlen);
size -= conv_restlen;
} 奇数の場合だけ考えるなら、この先で変換に失敗した場合の扱いに問題がありそう。 |
ucs-2le, ucs-2 は fencs から外す、っていうのでも良いかもしれない。 |
奇数の場合はコレで対処できた。 diff -r ef341d8811b2 src/fileio.c
--- a/src/fileio.c Mon Apr 15 22:22:58 2013 +0200
+++ b/src/fileio.c Tue Apr 23 22:13:07 2013 +0900
@@ -1380,6 +1380,8 @@
# endif
)
{
+ if (can_retry)
+ goto rewind_retry;
if (conv_error == 0)
conv_error = curbuf->b_ml.ml_line_count
- linecnt + 1; |
stdinはseekableじゃないですからね |
というのは utf-8 は制約が強いからコンバートしないまでも valid かどうかの判定は可能。 |
とりあえず直近の対策として enc=utf-8 のときは fencs に ucs-2 及び ucs-2le を入れないようにする。 少し遠い対策としては
をすれば良さそう。 |
と同じことは上に書いてたつもりでした。 |
ごめーんw 下の動作を追っててそこに至ったので。
とりあえず無視して良いんじゃないですかね。
本 issue としてはコレだけやれば良いかなと。 残りの作業は #371 でやりましょう。 |
修正しました。 https://bitbucket.org/koron/vim-kaoriya/commits/34e86f5c18722d12e22e3da6f3dec56c26c65f35 次回のリリースに反映されます。 |
ucs-2 は古いから代わりに utf-16 使えよって言われた。 |
7.3.915 で取り込まれました。 |
【発生環境】
Vim: KaoriYa版 7.3.905 (2013/04/21版)
OS: Windows 7 Starter 32bit版
【概要】
【再現手順】
switches\catalog\utf-8.vim
をswitches\enabled\
にコピーして、KaoriYa版VimをUTF-8化するa
を用意するvim a
でファイルを開く →fileencoding
がutf-8
になって "あ" と正しく表示されるtype a | vim -
で標準入力から流し込む →fileencoding
がucs-2le
になって "臣?" と化けて表示されるswitches\enabled\utf-8.vim
を削除して、Vimを元に戻すtype a | vim -
で標準入力から流し込む →fileencoding
がutf-8
になって "あ" と正しく表示される【その他】
標準入力から流した時だけというのが解せなかったのですが、guessの既知の制限か何かだったらすみません。
The text was updated successfully, but these errors were encountered: