2009年2月1日日曜日

XMLを扱う (その14) [Unicode][Common Lisp]


ワークフローの続き。

ソースを精査する前に、Lispの外の自分の環境のencodingを調べてみる。

** Mac OS X Leopard

http://images.apple.com/jp/macosx/pdf/L355785A_UNIX_TB_J.pdf

-----
OS内部(ってどこ?): UTF-32 [たぶんNFDなんじゃないか]
ファイルシステム(HFS+): UTF-16 [NFD]
アプリケーション: アプリケーション毎
Terminal.app: 選択可能。ただしUnicodeとしては、UTF-8 [NFD] (UTF-8-mac)。
-----

Ubuntuについては別途調べる。


** Allegro Common Lisp

http://www.franz.com/support/documentation/8.1/doc/iacl.htm

-----
internal representation: UTF-16
external formats:
Name Nicknames Comments
---- --------- --------
:latin1 :ascii, :8-bit, :iso8859-1, t
:1250 For MS Windows
:1251 For MS Windows
:1252 For MS Windows
:1253 For MS Windows
:1254 For MS Windows
:1255 For MS Windows
:1256 For MS Windows
:1257 For MS Windows
:1258 For MS Windows
:iso8859-2 :latin-2, :latin2
:iso8859-3 :latin-3, :latin3
:iso8859-4 :latin-4, :latin4
:iso8859-5 :latin-5, :latin5
:iso8859-6 :latin-6, :latin6
:iso8859-7 :latin-7, :latin7
:iso8859-8 :latin-8, :latin8
:iso8859-9 :latin-9, :latin9
:iso8859-14 :latin-14, :latin14
:iso8859-15 :latin-15, :latin15
:koi8-r

:emacs-mule For eli
:octets For uncovered octets
:void

:utf8 :utf-8
:big5
:gb2312
:euc :ujis
:874 For MS Windows
:932 For MS Windows
:936 For MS Windows
:949 For MS Windows
:950 For MS Windows
:jis
:shiftjis

:unicode BOM対応(BOM無しはLE)

などなど。まだいろいろあるようだ。

さて、internal representationとexternal formatsの関係について。

まず、REPL。Unicode Standardで定義されている名前を#\[name]に使える。
ただし空白はunderscoreにする。名前が無いものはそのまま?使える。

---
CL-USER(7): #\latin_capital_letter_l_with_stroke
#\Ł
CL-USER(8): (code-char #x0141)
#\Ł
CL-USER(9): #\気
#\気
---

実はこれはeli経由でやっているので、すんなりいくのはeliの賜物な気が
する。eliはexternal formats経由でやりとりしているので、純粋に
REPL(純粋なREPLって何だ?)の話題ではないといえばない。

さて、ACLでは、streamとforeign-function callにて、自動変換機能をもっ
ている。ここでの変換というのは、internal representaion と external
formats の間のこと。

さてexternal formatsの指定がどうなされているか。

まず*locale*にある。

---
CL-USER(6): *locale*
#<locale "ja_JP" [:UTF8-BASE] @ #x1000695502>
---

これが採用される。次に個別のstreamをopenする際に指定できる。これは
implemetation dependentであるexternal file formatをplaceとして利用
している、ということ。

これらexternal-formatsの指定にしたがってstreamに関するたとえば
read-charやwrite-charは動作する。

Streamのexternal-formatを調べるには例えばinspect。

---
CL-USER(12): (inspect *standard-output*)
A TENURED TERMINAL-SIMPLE-STREAM @ #x1000245e42 = #<TERMINAL-SIMPLE-STREAM [initial terminal io] fd 0/1 @ #x1000245e42>
0 Class --------> #<STANDARD-CLASS TERMINAL-SIMPLE-STREAM>
1 J-WRITE-BYTE -> #<Function DUAL-CHANNEL-WRITE-BYTE>
...
16 EXTERNAL-FORMAT -> The symbol :EMACS-MULE
...
36 SRC-POSITION-TABLE -> The symbol NIL
[1i] CL-USER(13):
---
-----

さて、これでソースを精査しようかと思ったが、closure-commonは.asdファ
イルの中でいろいろやっているようだ。

ASDFについておさらいをしてからか、もしくはしつつ進もう。

こつこつ。

0 件のコメント: