なんだこれは

はてなダイアリーから移転しました。

guess で 文字コードを判定させてひらく

guess という、日本語の文字コードを推定するライブラリがhttps://github.com/zqwell/guess あった。

common lisp は、clozure clで 使ってみた。

二回開いているので無駄っぽい。
普通に、vectorを 文字列に変換しましょう→自分
しかし、先頭の3行だけ欲しいような場合は、自分で文字列から行をパースせないかんのかしら。

clozure clは Shift_JIS を :CP932 で表すので :SJIS を変換しないといけない、はず。
直接編集するのもなんなので利用側で変換するかな。

(defun file-vector (file)
  (with-open-file (s file :direction :input :element-type '(unsigned-byte 8) )
    (let ((buf (make-array (file-length s) :element-type '(unsigned-byte 8))))
      (read-sequence buf s)
      buf)))

(defun guess-code (file)
  (let ((encode (guess:ces-guess-from-vector (file-vector file) :jp )))
    (if (eq encode :SJIS)
	:CP932
	encode)))

(defun open-with-guess-code (file &optional (max-line 30))
  (let ((encode (guess-code file)))
    (with-open-file (fs file
			:direction :input
			:external-format (ccl:make-external-format
					  :character-encoding encode))
      (loop for line = (read-line fs nil nil)
	 while line
	 collect line))))