t-sin / inquisitor

Encoding/end-of-line detection and external-format abstraction for Common Lisp
34 stars 3 forks source link

SJISの文字コードが入ったファイルがASCIIと判定されます #17

Closed cxxxr closed 9 years ago

cxxxr commented 9 years ago

指定したファイルはhttps://raw.githubusercontent.com/xyzzy-022/xyzzy/develop/lisp/winhelp.l

(with-open-file (in "winhelp.l"
                    :element-type '(unsigned-byte 8))
  (inquisitor:detect-encoding in :jp)) 
=> :UTF-8
cxxxr commented 9 years ago

detecting-buffer-sizeを大きめにすると正しく判定されました

t-sin commented 9 years ago

デフォルトの_detecting-buffer-size_より先にASCII以外の(UTF-8以外とされるような)文字があるケースですね。_detecting-buffer-size_自体あまりよろしくないですよね…。

t-sin commented 9 years ago

APIの整理が急務だと思っていて、その一環としてstreamやpathnameに対してはバッファサイズをoptionalに指定できるようにするつもりです。

cxxxr commented 9 years ago

ありがとうございます APIに関してそういう変更をしようとフォークしたんですが 英語が書けずコミットが終わりません

cxxxr commented 9 years ago

そういえばdetect-end-of-lineは改行コードが見つかるまで走査すればいいのならdetecting-buffer-sizeは必要ありませんね

それからベクタを一度だけ作ってその中で見ていくのはファイル全体を見ようとしたら ベクタが大きくなりすぎるのが気になります ある程度の大きさのベクタにその大きさ分だけデータを入れて見ていく動作を繰り返せたら良さそうです

t-sin commented 9 years ago

確かに確かに。 そもそも*detecting-buffer-size*なんて不要で、バッファサイズは引数で指定できるようにしたほうが、このissueのようなケースに対しては(全体としても)いいかなと思っていました。 具体的には

  1. *detecting-buffer-size*は消す
  2. detect-encodingdetect-end-of-line(名前短くしたい)をメソッドに
    • detect-external-formatと同じくベクタ、ストリーム、パスネームに対応
  3. ストリーム/ファイルに対してはバッファサイズを&optionalで指定できるように
    • detect-系メソッド全てに対してやる
    • もしファイル全体をチェックしてほしかったら:fullでも渡すとか

のような感じで。

メソッドにも&optionalとか使えるようなので(HyperSpec: defmethod)、pull requestをマージしたあとでそのような対応をしようかなと考えています。

結果としてdetect-external-format-from-fileは消すことになると思いますが、そのほうがスッキリしてていいのかな、と。

cxxxr commented 9 years ago

いいですね detect-external-format-from-fileは自分で書いといてなんですがあまり良いものではないと思います

t-sin commented 9 years ago

あっ。

を忘れるところでした。

別でAPI整理のissue立てようかな…。

cxxxr commented 9 years ago

別のissueにしたほうが良さそうですね

t-sin commented 9 years ago

別issue(#22)にしたのでクローズします。