Babel: 文字符号化ライブラリ

概要

Babelは文字符号化方式の相互変換や文字列とバイトベクトルの変換に用いるための高速なライブラリです。
このページでは、Babelの使い方を簡単に紹介します。

2つの関数と文字符号化方式

Babelの最も代表的な関数は以下の2つです。
  • string-to-octets: 文字列からバイトベクトルを生成します
  • octets-to-string: バイトベクトルから文字列を生成します
また、日本語関連で使用できる文字符号化方式は以下の通りです。list-character-encodings関数で取得できます。
  • :cp932
  • :eucjp
  • :utf-8 (:utf-8b)
  • :utf-16 (:utf-16be, :utf-16le)
  • :utf-32 (:utf-32be, :utf-32le)
これらの関数と符号化方式を組み合わせれば、簡単に使えます。string-to-octets関数は、文字列と:encodingキーワード引数を指定することで、バイトベクトルに変換できます。
(asdf:load-system :babel)
; => T

(babel:string-to-octets "あいうえお")
; => #(227 129 130 227 129 132 227 129 134 227 129 136 227 129 138)

(babel:string-to-octets "あいうえお" :encoding :cp932)
; => #(130 160 130 162 130 164 130 166 130 168)

(babel:string-to-octets "あいうえお" :encoding :eucjp)
; => #(164 162 164 164 164 166 164 168 164 170)
バイトベクトルから文字列に変換するには、onctets-to-string関数を使います。
(defun simple-array (n contents)
  (make-array n :element-type '(unsigned-byte 8) 
              :initial-contents contents))
; => SIMPLE-ARRAY

(babel:octets-to-string 
  (simple-array 15 '(227 129 130 227 129 132 227 129 134 227 129 136 227 129 138)))
; => "あいうえお"

(babel:octets-to-string 
  (simple-array 10 '(130 160 130 162 130 164 130 166 130 168))
                :encoding :cp932)
; => "あいうえお"

(babel:octets-to-string 
  (simple-array 10 '(164 162 164 164 164 166 164 168 164 170)) 
                :encoding :eucjp)
; => "あいうえお"

ファイルからの文字列取得

Babelを用いるとUTF-8以外の文字符号化方式を用いているテキストファイルから文字列を取得するのも簡単です。
ANSI Common Lispで定められたopen関数やwith-open-file関数では:external-formatキーワード引数が定められていますが、その引数に渡す文字符号化方式の指定方法は処理系によって異なります。その処理をBabelに任せると、処理系の違いを吸収してくれます。
Alexandriaにはread-file-into-byte-vector関数があり、ファイルから直接バイトベクトルを返すことができます。そのバイトベクトルをBabelのoctets-to-string関数に渡せば、文字コードの変換ができます。
(asdf:load-system :alexandria)
; => T
(asdf:load-system :babel)
; => T

(defun file-string (file encoding)
  (babel:octets-to-string
   (alexandria:read-file-into-byte-vector file)
   :encoding encoding))
; => FILE-STRING

(file-string #p"test.txt" :cp932)
; => "このファイルはCP932(Shift JIS)です。
;    うまく読み込めていますか。
;    "

0 件のコメント :

コメントを投稿