haskell-ja > Archives > 2012/01/05

2012/01/05 09:39:40 UTCmasterq
#
すいません。ちょっと日本語の扱いについて教えていただけないでしょうか。
2012/01/05 09:40:15 UTCmasterq
#
https://gist.github.com/1564437 こんなスクリプトを書いてみているのですが、curlコマンドに食わせるファイル名が化けてしまいます。
2012/01/05 09:40:51 UTCmasterq
#
xmlhtmlライブラリを使った場合に日本語の要素をうまく扱う方法を教えていただけないでしょうか。。。
2012/01/05 10:02:42 UTCshelarcy@twitter
#
そのコードでは utf8-string を使っていますが、そもそも http://t.co/HPcOGMDB から取って来るデータは UTF-8 ではなく euc-jp なのでファイル名が化けてしまうのではないでしょうか?
2012/01/05 10:05:17 UTCmasterq
#
えっとすいません。説明不足でした。
2012/01/05 10:06:08 UTCmasterq
#
curl -d p="All" -d c=a http://www.sampou.org/cgi-bin/haskell.cgi > all.html
nkf -w8 < all.html > all_utf8.html
してall_utf8.htmlを標準入力に食わせています。。。
2012/01/05 10:07:51 UTCshelarcy@twitter
#
Unix 環境なら、utf8-string ではなく System.IO モジュールの mkTextEncoding 関数で euc-jp を指定することで、http://t.co/HPcOGMDB から目的のデータを正しく取得できると思います。
#
c.f. http://t.co/FngUEkVB
2012/01/05 10:12:13 UTCmasterq
#
うううーちょっとためしてみます。。。
2012/01/05 10:12:52 UTCshelarcy@twitter
#
あらっ、そうでしたか。
#
&gt; nkf で UTF-8 のデータに変換している
#
取得後のデータは String や Text であって ByteString ではないので、適当に UTF-* な ByteString に変換してください。
2012/01/05 10:19:46 UTCmasterq
#
Data.ByteString.UTF8 の fromString をかましているつもりなのですが。。。うーん https://gist.github.com/1564437
2012/01/05 10:19:54 UTCshelarcy@twitter
#
多分,Text で取得して、Data.Text.Encoding の encodeUtf* で ByteString にするのが良いと思います。
2012/01/05 10:25:55 UTCshelarcy@twitter
#
あっ、utf8-string ではなく、System.IO モジュールで提供されている Handle での encode/decode を利用する場合の話です。
2012/01/05 10:27:03 UTCmasterq
#
https://gist.github.com/1564437 こういうかんじでしょうか。。。ううーん、変化ないです。。。
2012/01/05 10:31:05 UTCshelarcy@twitter
#
locale encoding は UTF-8 ですか? そうでなければ hSetEncoding でハンドルに utf8 を指定する必要がありますね。
2012/01/05 10:35:07 UTCshelarcy@twitter
#
あと、parseHTML した結果できる Document 型の値の Encoding フィールドはちゃんと UTF8 になっていますか? http://t.co/vhFBuQiF
2012/01/05 10:39:04 UTCmasterq
#
let Right (HtmlDocument en _ nodes) = parseHTML "stdin" $ encodeUtf8 con
2012/01/05 10:39:28 UTCmasterq
#
とした直後でprint enするとUTF8になってます。。。
2012/01/05 10:40:45 UTCmasterq
#
なんか盛大にかんちがいしている気がします。。。
2012/01/05 10:41:50 UTCshiro
#
どう化けてるかを調べると手がかりになるかも?
2012/01/05 10:48:09 UTCmasterq
#
あれ。pandoc使うとputStrLnする分には日本語出ます。。。
#
xmlhtmlさん。。。
2012/01/05 10:48:48 UTCmasterq
#
ひょっとしてsystem関数ってutf8通らなかったりするのでしょうか。。。
2012/01/05 10:49:52 UTCshiro
#
systemが通してないのか、systemが呼び出してるシェルが通してないのか、curlコマンドが通してないのか、色々可能性が。
2012/01/05 10:50:27 UTCmasterq
#
いや。system "echo curl hogehoge"しているので、systemが通していないことになります。
2012/01/05 10:50:47 UTCmasterq
#
shellが通していない、、、というのは、、、通すと思いこんでました。。。
2012/01/05 10:51:15 UTCmasterq
#
たしかcurlのライブラリがあったような気がするので、system使わずにそっちを使うべきなんでしょうか。。
2012/01/05 10:52:19 UTCshiro
#
system経由でなく直接外部コマンドを呼び出す方法とかないんですかね。
2012/01/05 10:54:05 UTCmasterq
#
Haskellのcurlライブラリはffiを使ってますね。。。
2012/01/05 10:54:27 UTCshiro
#
つまり、system(3)ではなくfork(2)/exec(2)経由で呼ぶってことですが
2012/01/05 10:54:58 UTCmasterq
#
xmonadのspawnってあったような。。
2012/01/05 10:55:16 UTCmaoe
#
System.Cmd.rawSystemとかSystem.Process.procが使えます。 > shellを経由しないコマンド実行
2012/01/05 10:56:00 UTCmasterq
#
みてみます。ありがとうございます。
2012/01/05 10:56:22 UTCmasterq
#
xmlhtmlのutf8問題は追える気力が... #orz
2012/01/05 11:02:39 UTCmasterq
#
rawSystemも化けるようなきがしています。不完全なコードをちょっとはってみます。
2012/01/05 11:03:58 UTCmasterq
#
https://gist.github.com/1564753 rawSystemを使うと抽出したファイル名が化ける。。。
2012/01/05 11:04:01 UTCshiro
#
ところでどう化けているか、については何かわかりますか? 例えばutf-8がlatin-1と解釈されているようだ、とか。
2012/01/05 11:05:52 UTCmasterq
#
https://gist.github.com/1564762 putStrLnすると化けない。。。
2012/01/05 11:06:29 UTCshelarcy@twitter
#
ああ、そういえば、GHC 7.0.x までの system 関数は locale encoding に対応できてませんね。 http://t.co/fZEy6sch
2012/01/05 11:09:12 UTCmasterq
#
そこのあたりのカンがないので、とりあえずログはりつけてみました。 http://dl.dropbox.com/u/1090053/GetAllPagePan_rawsystem.log http://dl.dropbox.com/u/1090053/GetAllPagePan_putstr.log
2012/01/05 11:09:45 UTCmasterq
#
GetAllPagePan_rawsystem.logこっちが化けてます。
2012/01/05 11:10:31 UTCshelarcy@twitter
#
GHC を 7.2.2 や 7.4.1 RC 1 にアップグレードするか、utf8-string の encodeString 関数で変換した文字列を渡してやってください。
2012/01/05 11:10:46 UTCmasterq
#
をを!pandocを使ったケースではなんかこれっぽいですね!ちょっとやってみます。
2012/01/05 11:13:30 UTCmasterq
#
rawSystem' cmd = rawSystem cmd . map encodeString これを使えばOKでした。とりあえずxmlhtmlはおいといて、rawSystem+Pandocでスクリプトを作ろうと思います。ありがとうございました。 (でいいのかな。。。)
2012/01/05 11:15:47 UTCshiro
#
あら解決したみたいで何より。ログ見た感じでは、ucs-4かutf-16になってから一番下のバイトだけ抜き出されてる感じですね。
2012/01/05 11:15:58 UTCmasterq
#
よくすぐわかりますね。。。
2012/01/05 11:17:08 UTCmasterq
#
htmlファイルをちょっといいかげんに解析するときはみなさんどんなライブラリを使われているのでしょうか。xmlhtmlはもう古いのでしょうか??
2012/01/05 11:18:14 UTCmasterq
#
http://nokogiri.org/ このなののHaskell版ってなにになるのかなと。。。
2012/01/05 11:46:24 UTCmasterq
#
いちおう結果報告で https://gist.github.com/1564930 このスクリプトでcurlでwilikiからページを取得できるようになりました。ありがとうございました。
2012/01/05 11:47:22 UTCmasterq
#
今なにをやっているかというと、 http://wiki.haskell.jp/http://www.sampou.org/cgi-bin/haskell.cgi のページを引っ越しさせようとしています。またよろしくお願いいたします。。。
2012/01/05 11:51:44 UTCshiro
#
む、それならwilikiのデータベースから直接生データをエクスポートしてフォーマット変換をかけるという手もあったかも、と思わなくもないけどマークアップ形式が大きく違うならhtml経由の方がいいのかな…
2012/01/05 11:53:33 UTCmasterq
#
えっと、生データをデータベースファイルから出す方法があればもっと助かります!最後にはmarkdownにしなきゃいけないんですが、それまでの道程が長いです。。。wiliki文法のファイルリストがヒストリなしで得られれば、後はpandoc reader書くだけなので楽ですー
2012/01/05 11:54:17 UTCmasterq
#
nobsunさんいらっしゃるかしら。。。 < sanpouのwilikiデータベース
2012/01/05 11:58:12 UTCshelarcy@twitter
#
@nobsun QT : masterq: nobsunさんいらっしゃるかしら。。。 &lt; sanpouのwilikiデータベース http://t.co/PMkikOWt
2012/01/05 11:59:27 UTCmasterq
#
でもなんかよくかんがえてみたら、pandocにhtml readerがあるので、とりあえずwilikiのページをかたっぱしからhtml=>markdown変換しちゃってみます
2012/01/05 12:02:13 UTCshelarcy@twitter
#
あら……twitter で呼びかける意味は特にありませんでしたか。
2012/01/05 12:03:39 UTCmasterq
#
ごめんなさい。。。
2012/01/05 12:03:56 UTCmasterq
#
おしゃれにreaderとか書く必要なかったです。。。 http://wiki.masterq.net/Sandbox/TestWiliki
2012/01/05 12:04:34 UTCmasterq
#
pandocは特にpatchを書く必要のないほど偉大だったということで。。。
2012/01/05 12:08:07 UTCmasterq
#
あとはWikiNameのリンクがsampouを向いてしまうことだけ小細工すれば良さそうです。。
2012/01/05 12:09:25 UTCshelarcy@twitter
#
あと、pandoc を使って HTML から Markdown に持って行くなら、(多少手間がかかりますが)このあたりの消失したページを Internet Archive から復旧させることもできそうですね。
#
http://t.co/w6U86X27
2012/01/05 12:11:57 UTCmasterq
#
むむ。検討します。。。というかたぶん一旦サルベージした後で連絡をいただければ挑戦してみます。まずはwilikiのAllボタンから辿れるページを引っ越ししたく。。
2012/01/05 12:13:59 UTCshelarcy@twitter
#
はい、分かりました。