あなたが間違っていること
は変数ではなくSYMBOL-MACRO*pathname-encoding*
であることに注意してください。CLISPマニュアルの注記にあるように、
注意: SYMBOL-MACROにはEXT:LETF/EXT:LEETF*を使用する必要があります。
LET/LET*は機能しません!
だから、あなたがする必要があるのは
(ext:letf ((*pathname-encoding* charset:utf-8)) ...)
(とにかくのline-terminator
モード*pathname-encoding*
は無視されます)。
例
$ touch 'идиотский файл'
$ ls
идиотский файл
$ LANG=C ls
?????????????????? ????????
$ LANG=C clisp -q -norc
> *pathname-encoding*
#<ENCODING CHARSET:ASCII :UNIX>
> *default-file-encoding*
#<ENCODING CHARSET:ASCII :UNIX>
> *terminal-encoding*
#<ENCODING CHARSET:ASCII :UNIX>
> (letf ((*pathname-encoding* charset:utf-8))
(with-open-file (o "foo" :direction :output :external-format charset:utf-8)
(format o "~A~%" (directory "*"))))
NIL
> (quit)
$ cat foo
(/home/sds/tmp/z/идиотский файл /home/sds/tmp/z/foo)
特定の問題のデバッグ
CLISP は、処理できない文字の代わりに出力したり返したり?
することはありません - エラーを通知します (エンコーディング仕様の 1 つを省略しようとすると、Invalid byte #xD0 in CHARSET:ASCII conversion
fromwrite
または fromのいずれかでエラーが発生しますdirectory
)。
したがって、問題は境界にあります。
- OS が Unicode の代わりに CLISP にクエスチョン マークを付けるか (CLISP は i18n を処理できないと考えているため)
- または、CLISP によって生成されたファイルが、低レベルの OS レイヤーによって誤って保存されます。
- または、ファイルを表示するために使用しているツールが Unicode 文字を表示できない
(最後のオプションだけがもっともらしく見えます)。
あなたができることは次のとおりです。
- エンコーディング仕様の削除から始めます - 変換エラーが発生しますか? デフォルトのエンコーディングの場所
*pathname-encoding*
を調べます (これは&cのようなシンボル マクロを表す Lisp の凝った言葉です)
*pathname-encoding*
であることを確認してutf-8
、次のようなことを試してください(coerce (pathname-name (car (directory "*"))) 'list)
-上記の私の例では(#\CYRILLIC_SMALL_LETTER_I ...)
、私のようにユニコード文字が見えますか、それとも見え#\?
ますか?
cygwin
( ls
、ls | od
、 ) を試して、 ls > foo; cat foo | od
ASCII 以外の文字をキャプチャできるかどうかを確認してください。