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))))