[ruby-list:50353] [再]Re: TkDND での日本語名の扱い
From:
Toshihiko Ichida <dogatana@...>
Date:
2016-07-08 23:29:00 UTC
List:
ruby-list #50353
こんにちは市田と申します。
WindowsでTkDNDを利用していて漢字ファイル名で問題があり、[ruby-list:49775]
を参考に、リスト取得後にencodeを繰り返すことで利用していました。
が、他にも問題があったので改めて整理してみました。
問題
1.取得したファイル名が漢字を含む場合・・49972の問題
2.ファイル名に空白が含まれている場合・・49776でも少し記載されている
3.パスに\が含まれる場合除去される・・今回はまったもの
2.はなんとか運用で逃げられるのですが、3.はパスそのものが変わるので運用で
回避することもできません。
何かの拍子?に入るようで条件がよくわからないのですが、サーバ上のファイル
名で発生しやすいように思います。
やむを得ず、Try&Errorで調べてみたところ、ファイルリストの分割に
TkComm.listが使用されているのがよろしくないようで、これを
TkComm.simplelistに変更することでパスに含まれる\をそのまま取り出すことが
できるようになりました。
また合わせて2.の空白を含むファイル名もうまく取得できるようになります。
もともと空白が含まれている場合でもうまく判別できるようになっているのが
TkComm.listでは考慮されないようです。
今回永井さんが 49992 に書かれているのを見たのですが、内容がどうもよく
わかりません :<
ただTkComm.listを継続して利用するとなっていると理解してまして、それだと
3.の問題が復活してしまいます。(パッチそのものは試せてません)
漢字ファイル名について、内容がUTF-8の文字列のEncodingが
ASCII-8BITになっているいるのそもそも問題(*)であるので、Windows環境限定
とすれば次の修正が考えられるのではないでしょうか。
* TkComm.simplist側のEncoding変換誤動作の原因と判断しています
このうち、
+ TkComm.simplelist(list)
は元の TkComm.list(list) で良いかもしれません。
--- tkdnd.rb.orig Mon Mar 14 11:24:12 2016
+++ tkdnd.rb Sat Jul 09 07:24:35 2016
@@ -52,7 +52,14 @@
PROC_TBL = [
[ ?n, TkComm.method(:num_or_str) ],
[ ?s, TkComm.method(:string) ],
- [ ?l, TkComm.method(:list) ],
+ [ ?l, proc do |list|
+ if TclTkLib::WINDOWING_SYSTEM == 'win32'
+ list.force_encoding('utf-8')
+ TkComm.simplelist(list).map { |x| x.tr('\\', '/') }
+ else
+ TkComm.simplelist(list)
+ end
+ end ],
[ ?L, TkComm.method(:simplelist) ],
[ ?w, TkComm.method(:window) ],
nil