From: Miyamoto Hiroaki Date: 2008-06-04T15:42:01+09:00 Subject: [ruby-list:45004] Re: EUC文字列のWindowsクリップボード書き込みについて みやもとです。 RubyはActiveScriptRuby1.8.6で、 1.8.6にはクリップボードライブラリがない?ようなので http://homepage1.nifty.com/a_nakata/ruby/のclipbrd.rbを使用しています。 SJIS→EUC変換はKconvライブラリで変換して、clipbrd.rbの def SetText(text) if (text == nil) || (text == "") return end if $OpenClipboard.Call(0) != 0 $EmptyClipboard.Call(); len = $lstrlen.Call(text); hmem = $GlobalAlloc.Call(GMEM_DDESHARE, len+1); pmem = $GlobalLockI.Call(hmem); $lstrcpyIP.Call(pmem, text); $SetClipboardData.Call(CF_TEXT, hmem); $GlobalUnlock.Call(hmem); $CloseClipboard.Call; end end end 関数に引数渡ししています。 クリップボードからの取り出しは Windows用フリーのテキストエディタに右クリックの貼り付けメニューで 取り出しています。 ----- Original Message ----- From: "KIMURA Koichi" To: "ruby mailing list" Sent: Wednesday, June 04, 2008 2:57 PM Subject: [ruby-list:45003] Re: EUC文字列のWindowsクリップボード書き込みについて > 木村です。 > > On Wed, 4 Jun 2008 12:59:19 +0900 > "Miyamoto Hiroaki" wrote: > >> みやもとと申します。 >> >> Excelのデータを元にUnixファイルを作成するため、 >> SJIS→EUC変換した文字列をWindowsクリップボード書き込みしたいのですが >> CF_TEXTフォーマットで、SetClipboardDataすると文字化けします。 > > 具体的にどういうコードで行ったのか見せてもらえますか? > > Cで、 > > #include > #define WINDOWS_LEAN_AND_MEAN > #include > > int > main() > { > > if (IsClipboardFormatAvailable(CF_TEXT)) { > HANDLE hData; > char *pszData; > > OpenClipboard(NULL); > hData = GetClipboardData(CF_TEXT); > pszData = (char *)GlobalLock(hData); > puts(pszData); > GlobalUnlock(hData); > CloseClipboard(); > > } > return 0; > } > > こういうのをでっち上げておいて、 > > echo こんにちは|nkf -e|putclip > > のようにしてクリップボードに送り込んだのを取り出してみても > ちゃんとEUC-JP で取得できてます。どこかで操作をミスってるということは > ないでしょうか? > > 特にクリップボードからの取り出しをどういうアプリでどのような操作で > 行っているのか気になります。 > > -- > 木村浩一 > > >