文字列とバイト列

プログラミング言語処理系における文字列の扱いというものには様々な戦略がある。 主要なものを挙げるなら以下のような種類が考えられる。

  • 文字列は一貫した文字コードを持つ。 他の文字コードが必要な場合には入出力の段階で変換する。 また、バイト列として扱いたい場合はバイト列を表す型との変換を必要とする。
  • それぞれの文字列は自分がどのような文字コードを使っているかの情報を持っている。
  • 文字列を表現する型はなく、バイト列で代用する。 どのような文字コードで表されるかはライブラリ、またはプログラマの裁量とする。

私が多用しているプログラミング言語 Scheme では R6RSUnicode サポートが必須とされ、文字型のオブジェクトは常に Unicode のコードポイントと相互変換可能なものであるということになった。 内部的にどのような符号で表現されるかは実装の裁量だが、いずれにしても文字コードとしては一貫した形で持つ戦略を採用しているわけだ。 (R7RS では ASCII の範囲外の文字は必須ではなくオプショナルな扱いになったが、 Unicode を想定していることに変更はない。)

ところが、古い時代には文字列がバイト列の代用品として使われている場合もあり、そのあたりの扱いは処理系によって柔軟に許容していることもある。 たとえば Gauche は内部的に UTF-8 を用いているのだが、文字コードとして不正な場合に「不完全文字列」としてフラグを立てつつも文字列として使えるようになっている。 Gauche では不完全文字列は将来的に削除される計画とのことで、不完全文字列を使ういくつかの手続きは非推奨という扱いになっている。 私が書いたスクリプトの中には不完全文字列を前提として書いているものもあるので、気付いたときには徐々に修正していこうと考えている。

Document ID: 1935dc817b1294b7dff363be85d8815d