09/07/06 11:12:29
結果的に正しく判断される確率が高い方がいい
102:デフォルトの名無しさん
09/07/06 12:04:51
そのためには文脈情報が要るんだよ
HTML だったら charset 読んでみるとか
句読点が改行文字の直前にあったら日本語だと思ってみるとか
東欧辞書にマッチするバイト列が頻出したら Latin-2 だと思ってみるとか
Iconv が guess に該当する機能を一切提供してないのは手抜きじゃなくて必然
多エンコーディングに対応すればするほど指数関数的に推測のコストは上がる
日本語だけ取っても Shift_JIS と CP932 と EUC-JP と EUC-JP-MS の4つを区別するのは至難
っていうか規格をちょっとずつ混ぜるなめんどくさいから
あとケータイ絵文字入り文字列をキャリア情報なし端末情報なしの素で送ってくる奴は即死刑で
103:デフォルトの名無しさん
09/07/06 12:33:21
次の質問の人どうぞ
104:デフォルトの名無しさん
09/07/06 15:37:50
/usr/local/lib/ruby1.9/1.9.1/minitest/unit.rb:359:in `puke':
incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError)
イライラ
105:デフォルトの名無しさん
09/07/06 15:54:27
rrseをUTF8で使うにはどうすればいいですか?
106:デフォルトの名無しさん
09/07/06 15:56:26
>>104
Ruby1.9向けテストで「なんかどっか書き間違ってる」時に出るやつだな
具体的にどのへんの行で詰まってるとかヒントぜんぜんなし
かろうじて -v でテストのメソッド名が出るくらい
107:デフォルトの名無しさん
09/07/06 15:58:00
>>105
rdoc のファイルと同じエンコーディングを -K とかで指定すればいいんじゃね
108:デフォルトの名無しさん
09/07/06 16:09:03
>89
詳細な解説ありがとうございます。
ためになりました。
>88
>普通はIO.read(foo)とするな
IOオブジェクトを簡単に読み取るにはこの方法を使えばいいんですね。
しかしopen-uriで拡張されたopenには同等のメソッドがありませんね。
URI.parse(foo)がIO.read(foo)と同等のことができますが、
URI.parseはHTTPリクエストのオプションをつけて動かすことができないんですよね。
URI.parse(uri, 'hogehoge' => 'foobar')のように。
アドバイスをいただき>84での問題は解決したのですが次の問題が発生してしまいました。。
109:デフォルトの名無しさん
09/07/06 16:09:48
下記のスクリプトがエラーを吐きます。
エラー文: `initialize': buffer error (Zlib::BufError)
困ったことに、通ったり通らなかったりします。
原因はたぶんですが2chのサーバが出力しているgzip圧縮したsubject.txtのほうだと思います。
板内のスレいずれかにカキコミがあればsubject.txtは書き換わるため、通る場合と通らない場合があるのだと予想しています。
しかしエラー文の意味がよく分からず、どのように回避すればよいのかが分かりません。
ちなみに拾ってきたgzip化subject.txtファイルをHDDに書き込んでアーカイバで開くと正しく読み取れています。
============= ここから ============
require 'open-uri'
require 'zlib'
header = {'accept-encoding' => 'gzip'}
url = 'URLリンク(gimpo.2ch.net)' # errorが一度も起きていない
url2 = 'URLリンク(gimpo.2ch.net)' # errorが起きたり起こらなかったりする
open(url, header) do |io|
Zlib::GzipReader.wrap(io) do |gz|
puts gz.read # urlの中身が出力されたあとにerrorが起きる
end
end
============= ここまで ============
110:デフォルトの名無しさん
09/07/06 16:19:50
>>109
原因は一発でわかったが、そろそろあんま話したくない
HTTPの知識のない状態でなに作る気なん?
111:デフォルトの名無しさん
09/07/06 16:23:31
別にいいじゃん。初心者スレなんだし。
答えるのいやなら他行けば?
112:デフォルトの名無しさん
09/07/06 16:25:29
libwww-perlの轍踏む気にはならんね
113:デフォルトの名無しさん
09/07/06 16:29:29
まあサイトや回線にどんだけ負荷かけて裁判起こされようが知ったこっちゃないが、
このへんがわかんないのはそもそも辛いと思うんだがどう
open-uri で open してテキストを read する以外の事をしようと思うなら、別途勉強がいると思う
114:デフォルトの名無しさん
09/07/06 16:36:36
2chにアクセスするアプリケーションは自力で調べて作ってもらうというのが一応不文律だったりする
115:デフォルトの名無しさん
09/07/06 16:43:06
>>109
open-uriは便利に見えるけどハマると厄介、net/httpの使い方をおぼえろ
res = Net::HTTP.get_response(URI(url))
txt = res.body
if res['content-encoding'] =~ /gzip/
txt = Zlib::GzipReader.wrap(StringIO.new(txt)) {|gz| gz.read }
end
puts txt
>>110
原因を教えてもらえないだろうか?
うちの環境では例外が発生しないので問題がわからない
116:デフォルトの名無しさん
09/07/06 16:43:45
content-encoding見てないのはマズいと思うけど
>>109はHTTPレベルの問題じゃないような
117:デフォルトの名無しさん
09/07/06 16:45:14
付け加えておくとgzじゃないものを食わせた時は
Zlib::GzipFile::Error: not in gzip format
118:デフォルトの名無しさん
09/07/06 16:47:52
もなじら名乗ってない時点で問題外
119:デフォルトの名無しさん
09/07/06 16:49:01
>109のスクリプトを書き間違えていました。
============= ここから ============
require 'open-uri'
require 'zlib'
header = {'accept-encoding' => 'gzip'}
url = 'URLリンク(gimpo.2ch.net)' # errorが一度も起きていない
url2 = 'URLリンク(gimpo.2ch.net)' # errorが起きたり起こらなかったりする
open(url, header) do |io|
Zlib::GzipReader.wrap(io) do |gz|
puts gz.read # urlの中身が出力されたあとにerrorが起きる
gz.finish #<= 書き忘れ
end
end
============= ここまで ============
>110
2chのスレのdatを収集するプログラムです。
たまに気がつくとスレが1001になってdat落ちしてしまって、最後に開いた地点までしか読めなくなるのが悲しいので、
過去に開いたことがあるスレを定期的に拾いなおしてくれるプログラムを作りたいと思いまして。
プログラム自体は完成していて意図した通りに動くのですが、
転送量を少しでも削減したくてdatだけではなくsubject.txtを拾うときにgzip化しようと欲を出したらうまくいかなくなりました。
120:デフォルトの名無しさん
09/07/06 16:54:41
スレ更新をせず書き込んでしまいました。
>113
一応、DLする度にsleep 1.0 を入れています。
これでは不十分でしょうか?
>114
それは大変失礼しました。
今後は自力解決したいと思います。
>115
datの取得ではnet/httpを使っています。
一つのdomainから複数のファイルを拾うときにはnet/http, 1つのファイルを拾うだけならopen-uriというふうに使い分けていました。
121:115
09/07/06 17:17:01
header渡してなかった
txt = URI(url).read(header)
if txt.content_encoding.include?('gzip')
: