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

CP932とMS932、どっちにしよう。 #250

Closed
koron opened this Issue Sep 8, 2012 · 19 comments

Comments

Projects
None yet
4 participants
@koron
Member

koron commented Sep 8, 2012

KaoriYa版に同梱されているlibiconvの仕様を変更するか否か、意見を聞かせてください。個人的には楽するために変更してしまいたいが、それによって引き起こされるユーザの混乱や不便が未知数ゆえ。

背景

参考: CP932//JISとMS932との差異

Windows版Vimではデフォルトの文字コードがCP932になります。KaoriYa版ではこのCP932を独自パッチ(該当箇所をほぼ書き直し)で実質MS932にしていました。これはユーザの利便性を考えてのことです。ただVimやlibiconvのメンテ状況を考えると、MS932を正しい形で押し込むのはほぼ無理だし、今の形で維持するのも非常に面倒になっています。

そこでもうMS932は忘れてCP932にできちゃったら楽なんだけど…というのが動機です。

@thinca

This comment has been minimized.

Member

thinca commented Sep 8, 2012

素人なのでよくわかってないのですが、MS932とCP932ってどこがどれくらい違うものなんでしょうか。

@koron

This comment has been minimized.

Member

koron commented Sep 8, 2012

@thinca 詳しくは、参考のリンクをみてください。致命的なのは「~」あたりかな。

@thinca

This comment has been minimized.

Member

thinca commented Sep 8, 2012

おっと、リンク見落としてました…見てみます!

@koron

This comment has been minimized.

Member

koron commented Sep 8, 2012

とりあえずCP932(の中身)を無理矢理MS932にしちゃう方法はできた。今回はなるべく簡単な方法で。

ただEUC-JPとかとの対応は良くないかも。ま、そうそう使わないし良いかな。

@ynkdir

This comment has been minimized.

Member

ynkdir commented Sep 9, 2012

enc=utf-8 で扱うファイルがユニコードと cp932 くらいなら素の libiconv でもあんまり困らないと思います。
utf-8 <-> cp932 の変換は Win32 API で変換してるし
enc=cp932 のときみたいに euc-jp のファイルを開こうとして変換エラーということもない。
とはいえ http://www2d.biglobe.ne.jp/~msyk/software/libiconv-patch.html が無難かなあと思います。

@ynkdir

This comment has been minimized.

Member

ynkdir commented Sep 9, 2012

今はcp932でff5eが通ったりちょっとよくなってるんですね。
1.11からとか…ずいぶん前だ…。

@k-takata

This comment has been minimized.

Member

k-takata commented Sep 9, 2012

リンク先は、単に CP932 というと Microsoft CP932 と IBM CP932 などがあって紛らわしいので、Microsoft CP932 のことを MS932 と書くといっているわけですが、この Issue では CP932 とは何を指していますか。
リンク先は、JIS (=Shift_JIS) と MS932 (=Microsoft CP932) の差異について述べているのであって、CP932 と MS932 ではないです。

@koron

This comment has been minimized.

Member

koron commented Sep 9, 2012

@ynkdir:

utf-8 <-> cp932 の変換は Win32 API で変換してるし

これマジ? 私もそんな記憶があったけど自身が持てなかった&調べるの面倒だったので。だとすれば

とはいえ http://www2d.biglobe.ne.jp/~msyk/software/libiconv-patch.html が無難かなあと思います。

Vimでの利用に限って言えば、コレすら要らないですよね。

@k-takata:
CP932 = 素の libiconv が規定するCP932です。

@k-takata

This comment has been minimized.

Member

k-takata commented Sep 9, 2012

CP932 = 素の libiconv が規定するCP932です。

あ、libiconv の CP932 って独自仕様なんですね。

utf-8 <-> cp932 の変換は Win32 API で変換してるし

libiconv-1.14 のソースを MultiByteToWideChar で grep してみましたが、見つかりませんでした。
lib/cp932.h を見ると次のように書かれています。

 * 2. Some characters in the JISX0208 range are defined differently:
 *
 *     code   SHIFTJIS.TXT                   CP932.TXT
 *    0x815F  0x005C # REVERSE SOLIDUS       0xFF3C # FULLWIDTH REVERSE SOLIDUS
 *    0x8160  0x301C # WAVE DASH             0xFF5E # FULLWIDTH TILDE
 *    0x8161  0x2016 # DOUBLE VERTICAL LINE  0x2225 # PARALLEL TO
 *    0x817C  0x2212 # MINUS SIGN            0xFF0D # FULLWIDTH HYPHEN-MINUS
 *    0x8191  0x00A2 # CENT SIGN             0xFFE0 # FULLWIDTH CENT SIGN
 *    0x8192  0x00A3 # POUND SIGN            0xFFE1 # FULLWIDTH POUND SIGN
 *    0x81CA  0x00AC # NOT SIGN              0xFFE2 # FULLWIDTH NOT SIGN
 *
 *    We don't implement the latter 6 of these changes, only the first one.
 *    SHIFTJIS.TXT makes more sense. However, as a compromise with user
 *    expectation, we implement the middle 5 of these changes in the
 *    Unicode to CP932 direction. We don't implement the last one at all,
 *    because it would collide with the mapping of 0xFA54.

試してませんが、Unicode → CP932 → Unicode と変換すると、U+FF5E → 0x8160 → U+301C となるんじゃないかと予想。
enc=cp932 で UTF-8 のファイルを編集すると、中身が変わってしまいませんか?

@ynkdir

This comment has been minimized.

Member

ynkdir commented Sep 9, 2012

utf-8 <-> cp932 の変換は Win32 API で変換してるし

これは Vim の中の話です。

@koron

Vimでの利用に限って言えば、コレすら要らないですよね。

まあ拡張入っててもじゃまになるもんでもなし
あればいざというときわざわざ入れ替える必要もなくて楽なのかなていどの考えです。

@koron

This comment has been minimized.

Member

koron commented Sep 9, 2012

@k-takata

enc=cp932 で UTF-8 のファイルを編集すると、中身が変わってしまいませんか?

変わりますよ。ただWindowsならそれで良いんですよ、メモ帳でもANSI経由させちゃえば変わりますから。逆に変わってくれないと困ることのほうが多い(過去には多かったというほうが良いかも)。

@ynkdir

まあ拡張入っててもじゃまになるもんでもなし

Vimユーザはあっても困らないかも。でもlibiconvのメンテ的には邪魔になるんですよね。

@k-takata

This comment has been minimized.

Member

k-takata commented Sep 9, 2012

これは Vim の中の話です。

そうでしたか。これは失礼しました。

変わりますよ。ただWindowsならそれで良いんですよ、メモ帳でもANSI経由させちゃえば変わりますから。逆に変わってくれないと困ることのほうが多い(過去には多かったというほうが良いかも)。

U+FF5E が euc=cp932(iconv) なVimを通して U+301C に変わってしまうと、他の内部 cp932(MS) なアプリで開いたときに ? に化けてしまいますが。

@koron

This comment has been minimized.

Member

koron commented Sep 9, 2012

@k-takata

U+FF5E が euc=cp932(iconv) なVimを通して U+301C に変わってしまうと、他の内部 cp932(MS) なアプリで開いたときに ? に化けてしまいますが。

あ~ enc=cp932 の時に、CP932とUTF-8との変換はWin32 APIではやらないのか…やっぱミニマムでもMS932を維持するしか無いか。

enc=cp932 をとっとと捨て去りたいけど、そういうわけにもいかないと。

@koron

This comment has been minimized.

Member

koron commented Sep 9, 2012

ここまでの情報、議論をすり合わせると以下の結論となります。

  • enc=utf-8 運用ならば MS932 を導入するメリットはほぼ無い
    • (前提)enc=utf-8の時はiconvではなくWin32 APIで変換されるため
  • enc=cp932 運用ならば MS932 を導入せざるを得ない
    • (主たる動機)Vimで作られたUNICODE系ファイルが他のツールで利用者の意図通りに表示できない可能性があるため

なんか間違ってるとか情報たらなそうなところはありますか?

@k-takata

This comment has been minimized.

Member

k-takata commented Sep 9, 2012

U+FF5E が euc=cp932(iconv) なVimを通して U+301C に変わってしまうと、

ごめんなさい。ここの部分の動作は実際には確認できていません。
あくまで、@koron さんの「変わりますよ。ただWindowsならそれで良いんですよ」に対して、変わってしまっていたらまずいのでは?ということです。

@koron

This comment has been minimized.

Member

koron commented Sep 9, 2012

私のコレは

変わりますよ。ただWindowsならそれで良いんですよ

私が幾つか誤解していて、特に enc=cp932 でも 「UTF-8とCP932との変換にWin32 APIが使われるなら」ってつもりで書いてました。でもこれは誤りで、実際は enc=utf-8 なら でしたから、素のCP932だと変わってしまって、だいたい困るハズです。まぁVista移行にはU+301CもU+FF5Eも同じように見えるとか、なんかいろいろありそうですが…まぁその辺は忘れましょう。

@ynkdir

This comment has been minimized.

Member

ynkdir commented Sep 9, 2012

enc=cp932 でも utf-8 <-> cp932 の変換は Win32 API です。
ただ utf-16 は iconv で変換されるのでやっぱり困るとは思います。

@koron

This comment has been minimized.

Member

koron commented Sep 9, 2012

enc=cp932 でも utf-8 <-> cp932 の変換は Win32 API です。

thanks! これが知りたかった&そうであって欲しいと願ってたw

utf-16 は iconv で変換されるのでやっぱり困る

あ~MSでUNICODEといえばUCS-2LE相当でしたね。いまはUTF-16って言わなきゃだめなのかな…ってこれは本題ではないですね。

この数日でMS932化パッチは以前のものより格段に簡単になった&iconvのテストの仕組みを完全掌握したので、このissueを起こした時の想定よりもパッチ維持コストは大幅に下がっています。なのでなんかもうそのままで良いかな、という気持ちも無くはない。

逆にMS932を維持した場合の懸念点はないかが気になります。あるかどうかわかりませんが「UNIX版と動作が違うからスクリプトが…」とかなんとか。

@koron

This comment has been minimized.

Member

koron commented Sep 15, 2012

MS932の維持とします。

MS932を維持した場合の懸念点はないか

数日考えたけど、許容範囲でしか無かった。その一方

utf-16 は iconv で変換されるのでやっぱり困る
MSでUNICODEといえばUCS-2LE相当

これが最大の意思決定要因となりました。

@koron koron closed this Sep 15, 2012

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment