R6RS:翻訳:Standard Libraries:8.2.4 Transcoders

R6RS:翻訳:Standard Libraries:8.2.4 Transcoders

8.2.4 コード変換器

様々に異なる Unicode のエンコーディングスキームでは、文字や文字列をバイト列にエンコードし、また逆にデコードする標準的な方法が述べられている [12]。本文書ではコーデックは変更不可能な Scheme のオブジェクトであり、 Unicode やそれに類似のエンコーディングスキームを表現する。

行末形式はシンボルで、 none でない場合、テキストポートのコード変換器が行末をどのように表現するかを表す。

コード変換器は変更不可能な Scheme のオブジェクトであり、コーデックと行末形式とデコーディングエラーの方法を組み合わせたものである。各コード変換器は何らかの特定の双方向的な(ただし、無損失である必要はない)状態を持つことのある、バイト列と Unicode の文字や文字列との翻訳である。各コード変換器は入力方向(バイトから文字へ)か出力方向(文字からバイトへ)に動作することができる。仮引き数名 transcoder は対応する引き数がコード変換器でなければならないことを意味する。

バイナリポートはバイナリ入出力をサポートするポートであり、コード変換器とは対応づけられていず、テキスト入出力もサポートしていない。テキストポートはテキスト入出力をサポートし、バイナリ入出力はサポートしない。テキストポートには対応するコード変換器があることもありないこともある。

[procedure] (latin-1-codec)

[procedure] (utf-8-codec)

[procedure] (utf-16-codec)

これらは ISO 8859-1、 UTF-8、 UTF-16 エンコーディングスキーム用の定義済みのコーデックである [12]。

これらの手続きへの呼び出しはいずれも同一の手続きの別の呼び出しの戻り値と eqv? の意味で等価である。

[syntax] (eol-style <eol-style symbol>)

<eol-style symbol> はシンボルで、その名前は lf、 cr、 crlf、 nel、 crnel、 ls、 none のいずれかである。このフォームは対応するシンボルに評価される。行終端形式シンボルの名前がこれらのうちのひとつでなかった場合、その効果と結果は実装系依存である。特に、戻り値が make-transcoder の eol-style 引き数に適合する行終端形式シンボルであることもある。そうでない場合には例外が発生する。

none 以外の行終端形式シンンボルは特定の行末エンコーディングを表す。

lf

<linefeed>

cr

<carriage return>

crlf

<carriage return> <linefeed>

nel

<next line>

crnel

<carriage return> <next line>

ls

<line separator>

コード変換器をともなったテキストポートで、そのコード変換器の行終端形式シンボルが none であるとき、変換は行われない。テキスト入力ポートについては、 none 以外の任意の行終端形式シンボルは上で挙げた行末エンコーディングはすべて単一の改行に変換されることを意味する。出力テキストポートについては、 none と lf は等価である。改行文字は指定された行終端形式シンボルにしたがってエンコードされ、それ以外の行末にかかわる文字はそのままにエンコードされる。

: <eol-style symbol> は名前だけに意味がある。

[procedure] (native-eol-style)

プラットフォームで規定の行末形式を返す。例えば、 Unix では lf であり、 Windows では crlf である。

[condition type] &i/o-decoding

[procedure] (make-i/o-decoding-error port)

[procedure] (i/o-decoding-error? obj)

このコンディション型は次のように定義することができる。

(define-condition-type &i/o-decoding &i/o-port
  make-i/o-decoding-error i/o-decoding-error?)

この型の例外はポートからのテキスト入力のひとつで、バイト列がポートのコード変換器の入力方向で文字ないし文字列に変換できなかった場合に発生する。

この例外が発生した場合、ポートの位置は不正なエンコーディングの後にある。

[condition type] &i/o-encoding

[procedure] (make-i/o-encoding-error port char)

[procedure] (i/o-encoding-error? obj)

[procedure] (i/o-encoding-error-char condition)

このコンディション型は次のように定義することができる。

(define-condition-type &i/o-encoding &i/o-port
  make-i/o-encoding-error i/o-encoding-error?
  (char i/o-encoding-error-char))

この型の例外の起こるのは、ポートへのテキスト出力操作のひとつで、ポートのコード変換器の出力方向で文字がバイト列に変換できなかった場合である。 char はエンコードできなかった文字列である。

[syntax] (error-handling-mode <error-handling-mode symbol>)

<error-handling-mode symbol> は名前が ignore、 raise、 replace のいずれかであるシンボルである。エラー取り扱いモードの名前がこれらのうちのひとつでない場合、効果と結果は実装系依存である。戻り値は make-transcoder の handling-mode 引き数に適合するエラー取り扱いモードであることもある。そうでなければ、例外が発生する。

: <error-handling-style symbol> は名前にだけ意味がある。

コード変換器のエラー取り扱いモードはエンコーディング/デコーディングエラーのあった場合のテキスト入出力処理の振舞いを指定する。

テキスト入力処理で不正ないしは不完全な文字エンコーディングに遭遇した場合、エラー取り扱いモードが ignore である場合、適切な個数の不正なバイト列が無視され、デコード処理が後続の文字について続けられる。 replace である場合、置き換え文字列 U+FFFD がデータストリームに挿入され、適切な個数のバイト列が無視され、デコード処理が後続の文字について続けられる。 raise であった場合、 &i/o-decoding コンディション型の例外が発生する。

テキスト出力操作でエンコードできない文字列に遭遇した場合、エラー取り扱いモードが ignore であれば、その文字は無視され次の文字からエンコーディングが再開される。 replace であった場合、コーデック依存の置き換え文字がコード変換器から発行され、エンコーディングは次の文字から再開される。コーデックが Unicode エンコーディングのひとつのコード変換器では置き換え文字列は U+FFFD であるが、 Latin-1 エンコーディングの場合は ? 文字である。エラー取り扱いモードが raise であった場合、 &i/o-encoding コンディション型の例外が発生する。

[procedure] (make-transcoder codec)

[procedure] (make-transcoder codec eol-style)

[procedure] (make-transcoder codec eol-style handling-mode)

codec はコーデックでなければならない。 eol-style はもしあれば行末形式シンボル、 handling-mode はもしあればエラー取り扱いモードシンボルでなければならない。 eol-style は省略することができ、その場合にはプラットフォームネイティブの行末スタイルが使われる。 handling-mode も省略することができ、その場合は replace になる。戻り値は引き数で指定された振舞いをするコード変換器である。

[procedure] (native-transcoder)

ロカール依存の「native な」コード変換を表すこともある、実装系依存のコード変換器を返す。

[procedure] (transcoder-codec transcoder)

[procedure] (transcoder-eol-style transcoder)

[procedure] (transcoder-error-handling-mode transcoder)

コード変換器オブジェクトへのアクセサである。 make-transcoder の返したコード変換器に適用すると、それぞれ codeceol-stylehandling-mode 引き数の値を返す。

[procedure] (bytevector->string bytevector transcoder)

bytevectortranscoder の入力方向にしたがってコード変換した文字列を返す。

[procedure] (string->bytevector string transcoder)

stringtranscoder の出力方向にしたがってコード変換した文字列を返す。

More ...