Discussion:
[ruby-list:49771] TkDND での日本語名の扱い
(too old to reply)
Umino
2014-03-06 03:50:47 UTC
Permalink
Umino と申します

実は以前に OKWaveに投稿した内容ですが、
回答無しで期限切れになってしまいました。

Ruby 2.0.0p353 (2013-11-22) [i386-mingw32]
__ENCODING__ Windows-31J
TkDND 2.6
上記の環境にて
TkDNDで受け取る,日本語ファイル名が文字化けしてしまいます。

例えば
txt = TkText.new(nil){
dnd_bindtarget('text/uri-list','<Drop>','%D'){|d|
p d
insert('end',d[0])
insert('end',"\n")
}
}
txt.pack

として、
"c:/usr/dev/あ" という名前のファイルをドロップすると

["C:/usr/dev/\xC3\x83\xC2\xA3\xC3\x82\xC2\x81\xC3\x82\xC2\x82"]
もちろん、TkTextでも文字化けしてしまいます。

素のTcl/Tk で同じように行った場合は文字化けなく実行
出来るので、Ruby側エンコ-ディングの扱いで何とかなる問題かとは
思っていますが、nkfで '-W','-W16' 等試しても対応できず
そこから行き詰っています。

どなたか、変換方法 ご教授頂けないでしょうか。
宜しくお願いします。
Nobuyoshi Nakada
2014-03-06 05:53:08 UTC
Permalink
Post by Umino
"c:/usr/dev/あ" という名前のファイルをドロップすると
["C:/usr/dev/\xC3\x83\xC2\xA3\xC3\x82\xC2\x81\xC3\x82\xC2\x82"]
もちろん、TkTextでも文字化けしてしまいます。
$ ruby -e 'p ARGV[0].encode("iso-8859-1", "utf-8").encode("iso-8859-1", "utf-8")' $'\xC3\x83\xC2\xA3\xC3\x82\xC2\x81\xC3\x82\xC2\x82'
"\xE3\x81\x82"

ということで、UTF-8文字列にISO-8859-1(Latin-1)→UTF-8の変換を二度繰り返しているみたいですね。
Umino
2014-03-06 14:56:47 UTC
Permalink
Nakada さん
有難う御座います。
Post by Nobuyoshi Nakada
$ ruby -e 'p ARGV[0].encode("iso-8859-1", "utf-8").encode("iso-8859-1", "utf-8")' $'\xC3\x83\xC2\xA3\xC3\x82\xC2\x81\xC3\x82\xC2\x82'
"\xE3\x81\x82"
ということで、UTF-8文字列にISO-8859-1(Latin-1)→UTF-8の変換を二度繰り返しているみたいですね。
u8str = d[0].encode("iso-8859-1","utf-8").encode("iso-8859-1","utf-8")
後は
u8str.encode('cp932','utf-8') もしくは NKF.nkf('-Ws', u8str)
で見事に日本語パスを表示出来ました。

文字コードに関して上手く整理出来ておらず、もっぱらNKFだよりでしたので
複数回の変換がされているなど想像も出来ませんでした。
#何故、2回変換が行われるのかは分かりませんが・・・・

本当に助かりました。
Hidetoshi NAGAI
2014-03-07 01:20:50 UTC
Permalink
永井@知能.九工大です.

From: Umino <jam280400-/E1597aS9LR3+***@public.gmane.org>
Subject: [ruby-list:49775] Re: TkDND での日本語名の扱い
Date: Thu, 6 Mar 2014 23:56:47 +0900 (JST)
Post by Umino
文字コードに関して上手く整理出来ておらず、もっぱらNKFだよりでしたので
複数回の変換がされているなど想像も出来ませんでした。
#何故、2回変換が行われるのかは分かりませんが・・・・
ごめんなさい.Ruby/Tk のバグでしょうね.

# 可能であれば,OKWave とかではなく,ruby-list ML や ruby-dev ML とかで
# 問い合わせや報告をしていただけますと助かります.

Ruby 1.9 以降は Ruby 上の encoding と Tcl/Tk 上の encoding との
2つの encoding を扱わねばならなくなったため,
判断や処理を誤るとこうした過剰変換などが生じてしまいます.
大筋では問題が出ないようにしているつもりですが,
(特に I/O 絡みの部分では) 処理誤りがまだ残っていたようです.
バグ修正はきちんとするつもりですが,
目前は応急処置で対応しておいていただけますと幸いです.

よろしくお願い致します.
--
永井 秀利 (nagai-iKxUiVHJP4pSXnIrXG/***@public.gmane.org)
九州工業大学大学院情報工学研究院知能情報工学研究系知能情報メディア部門助教
Umino
2014-03-08 02:28:54 UTC
Permalink
永井様
有難う御座います。

いくつかのGUIライブラリーを試しましたが、TKが一番使いやすかったです。
他はShoesが面白く感じましたがDrag&Drop機能が見つけられず
断念しました。

変換の問題は、Nakadaさんからご教授頂いた方法で現状対応でき
ています。
日本語+”空白”を含んだパスの場合の処理に問題がありますが、
その辺りは運用で補います。
(Tkが”空白”でスライスするのは仕方ないと思いますので)

Ruby/Tkはとっかりは易いけれど、奥が深く感じます。
サンプルを理解しきれていないスキルではまだまだです。
Tkの知識があれば様子は変わるのでしょうが・・・・。

GUI化したいスクリプトが未だ沢山あるので、地道に取り組んでいきます。
Hidetoshi NAGAI
2014-10-24 15:43:47 UTC
Permalink
永井@知能.九工大です.

かなり古い話ですが,下記メールの件です.

考えた挙句,「余計な解釈はしない」というのが正解かなと結論付けました.

タイプごとに変換を変えるとかも考えたのですが,
* タイプは勝手に定義することも可能である (未知のタイプには対応できない) こと
* encoding を勝手に憶測すると間違いを生じやすいこと
* データをどう解釈したいか or すべきかを知っているのはプログラマであること
というようなことから,受け取ったままに引き渡すのがいいだろうという判断です.

通常は encoding も設定されていない (ASCII-8BIT になっている) ので,
force_encoding をかけたり,TkComm.simplelist でリストとして分解したりは,
プログラマが必要に応じて行うというのが一番確実だと思います.

というわけで,以下のパッチのような変更ではいかがでしょうか.

======================================================================
--- tkdnd.rb.orig 2013-11-27 06:19:58.369532997 +0900
+++ tkdnd.rb 2014-10-25 00:19:07.151774217 +0900
@@ -11,7 +11,7 @@
# call setup script
require 'tkextlib/tkDND/setup.rb'

-TkPackage.require('tkdnd')
+TkPackage.require('tkdnd', '1.0')

module Tk
module TkDND
@@ -35,7 +35,7 @@
[ ?b, ?L, :codes ],
[ ?c, ?s, :code ],
[ ?d, ?l, :descriptions ],
- [ ?D, ?l, :data ],
+ [ ?D, ?s, :data ],
[ ?L, ?l, :source_types ],
[ ?m, ?l, :modifiers ],
[ ?t, ?l, :types ],
@@ -158,7 +158,7 @@
cmd = Proc.new
end

- args = [None] if args.empty
+ args = [TkComm::None] if args.empty?

tk_call('dnd', 'bindsource', @path, type, cmd, *args)
self
======================================================================

From: Hidetoshi NAGAI <***@ai.kyutech.ac.jp>
Subject: [ruby-list:49776] Re: TkDND での日本語名の扱い
Date: Fri, 07 Mar 2014 10:20:50 +0900 (JST)
Post by Hidetoshi NAGAI
Subject: [ruby-list:49775] Re: TkDND での日本語名の扱い
Date: Thu, 6 Mar 2014 23:56:47 +0900 (JST)
Post by Umino
文字コードに関して上手く整理出来ておらず、もっぱらNKFだよりでしたので
複数回の変換がされているなど想像も出来ませんでした。
#何故、2回変換が行われるのかは分かりませんが・・・・
ごめんなさい.Ruby/Tk のバグでしょうね.
# 可能であれば,OKWave とかではなく,ruby-list ML や ruby-dev ML とかで
# 問い合わせや報告をしていただけますと助かります.
Ruby 1.9 以降は Ruby 上の encoding と Tcl/Tk 上の encoding との
2つの encoding を扱わねばならなくなったため,
判断や処理を誤るとこうした過剰変換などが生じてしまいます.
大筋では問題が出ないようにしているつもりですが,
(特に I/O 絡みの部分では) 処理誤りがまだ残っていたようです.
バグ修正はきちんとするつもりですが,
目前は応急処置で対応しておいていただけますと幸いです.
よろしくお願い致します.
--
永井 秀利 (***@ai.kyutech.ac.jp)
九州工業大学大学院情報工学研究院知能情報工学研究系知能情報メディア部門助教
Loading...