For Gauche 0.9.5


Next: , Previous: , Up: 組み込みライブラリ   [Contents][Index]

6.10 文字

Builtin Class: <char>
Reader Syntax: #\charname

[R7RS] リテラルの文字オブジェクトを表現します。

リーダーは#\に出会うと、まず次の文字を読み込みます。それが文字 ()[]{}" \|;# のいずれかならば、その文字自身となります。 そうでなければ、単語を構成しない文字に出会うまで文字が続けて読み込まれます。 もし一文字しか読まれなければ、その文字自身となります。そうでなければ その単語が文字の名前として解釈されます。 それが有効な文字の名前でなければエラーとなります。

以下の文字の名前が認識されます。これらの文字の名前は大文字小文字を区別しません。

space

スペース (ASCII #x20)

newline, nl, lf

改行文字 (ASCII #x0a)

return, cr

復帰文字 (ASCII #x0d)

tab, ht

水平タブ (ASCII #x09)

page

フォームフィード、改ページ (ASCII #x0c)

escape, esc

エスケープ (ASCII #x1b)

delete, del

デリート (ASCII #x7f)

null

NUL文字 (ASCII #x00)

xN

N が16進表記の整数であるとき、Unicodeコードポイントが整数N であるような文字。これはR7RSの字句構文です。(下の互換性に関する注も見てください。)

uN

Nが4桁または8桁の16進数整数であるとき、UCSコードNであるような文字。 これはGaucheの古い構文です。新規のコードでは\xNを使ってください。 (下の互換性に関する注も見てください。)

#\newline ⇒ #\newline ; 改行文字
#\x0a     ⇒ #\newline ; 改行文字
#\x41     ⇒ #\A       ; ASCII文字 ’A’
#\x3042   ⇒ #\あ      ; 平仮名「あ」
#\x2a6b2  ⇒ ; JISX0213 2-94-86

互換性に関する注: 0.9.4まで、Gaucheは\xNN構文を、 Unicodeコードポイントでなく内部文字エンコーディングで文字を表記するのに 使っていました。Gaucheの内部エンコーディングをutf-8もしくは noneでコンパイルされている場合は両者に違いはありません (noneの場合、U+00ffまでの文字しか扱うことができませんが、 扱える範囲内ではUnicodeと一致します)。 内部エンコーディングがeuc-jpsjisの場合、 \xNNで記されたASCIIの範囲外の文字の解釈は、 0.9.3.3およびそれ以前のGaucheとは異なることになります。

リーダのモードをleagcyにセットすれば(リーダー字句モード参照)、 #\xNNは以前と同じ解釈となり、互換性は保たれます (ただし、R7RSとは非互換になります)。 あるいは#\uNNNN表記や文字そのものを表記することで、 以前のGaucheでも新しいGaucheでも動作するようにできます。

Function: char? obj

[R7RS] objが文字なら#tを、そうでなければ#fを返します。

Function: char=? char1 char2 char3 …
Function: char<? char1 char2 char3 …
Function: char<=? char1 char2 char3 …
Function: char>? char1 char2 char3 …
Function: char>=? char1 char2 char3 …

[R7RS] 文字を比較します。比較は内部の文字エンコーディングで行われます。

Function: char-ci=? char1 char2 char3 …
Function: char-ci<? char1 char2 char3 …
Function: char-ci<=? char1 char2 char3 …
Function: char-ci>? char1 char2 char3 …
Function: char-ci>=? char1 char2 char3 …

[R7RS] 文字を、大文字小文字を区別せずに比較します。 比較はそれぞれの文字のfoldcaseの内部文字エンコーディングに基づいて行われます。 foldcaseについては下のchar-foldcaseを参照してください。

R7RSではこれらの手続きは(scheme char)ライブラリにあります。

Function: char-alphabetic? char
Function: char-numeric? char
Function: char-whitespace? char
Function: char-upper-case? char
Function: char-lower-case? char

[R7RS] 文字charがそれぞれアルファベット (Unicode文字カテゴリ LuLlLtLmLoNl)、 数字 (Unicode文字カテゴリ Nd)、 空白文字 (Unicode文字カテゴリ ZsZpZl)、 大文字 (Unicode文字カテゴリ Lu)、 小文字 (Unicode文字カテゴリ Ll)の時に真の値を返します。

R7RSではこれらの手続きは(scheme char)ライブラリにあります。

Function: char-general-category char

[R6RS] 文字charのUnicode general categoryを表す、以下のシンボルのいずれかを返します。

CcOther, Control
CfOther, Format
CnOther, Not Assigned
CoOther, Private Use
CsOther, Surrogate
LlLetter, Lowercase
LmLetter, Modifier
LoLetter, Other
LtLetter, Titlecase
LuLetter, Uppercase
McMark, Spacing Combining
MeMark, Enclosing
MnMark, Nonspacing
NdNumber, Decimal Digit
NlNumber, Letter
NoNumber, Other
PcPunctuation, Connector
PdPunctuation, Dash
PePunctuation, Close
PfPunctuation, Final quote
PiPunctuation, Initial quote
PoPunctuation, Other
PsPunctuation, Open
ScSymbol, Currency
SkSymbol, Modifier
SmSymbol, Math
SoSymbol, Other
ZlSeparator, Line
ZpSeparator, Paragraph
ZsSeparator, Space

Gaucheがeuc-jpかshift_jisエンコーディングでコンパイルされている場合、 Unicodeに対応するものがない文字がいくつかあります (各文字は、Unicode一文字+Unicode結合文字で表現できます)。 これらの文字については、以下のとおり暫定的にカテゴリを割り当てています。 将来のUnicodeにこれらの文字が取り込まれた場合は、Unicodeで決められる カテゴリに変更されるでしょう。

SJISEUCCatUnicode
82F5A4F7LoU+304B U+309A (Semi-voiced Hiragana KA)
82F6A4F8LoU+304D U+309A (Semi-voiced Hiragana KI)
82F7A4F9LoU+304F U+309A (Semi-voiced Hiragana KU)
82F8A4FALoU+3051 U+309A (Semi-voiced Hiragana KE)
82F9A4FBLoU+3053 U+309A (Semi-voiced Hiragana KO)
8397A5F7LoU+30AB U+309A (Semi-voiced Katakana KA)
8398A5F8LoU+30AD U+309A (Semi-voiced Katakana KI)
8399A5F9LoU+30AF U+309A (Semi-voiced Katakana KU)
839AA5FALoU+30B1 U+309A (Semi-voiced Katakana KE)
839BA5FBLoU+30B3 U+309A (Semi-voiced Katakana KO)
839CA5FCLoU+30BB U+309A (Semi-voiced Katakana SE)
839DA5FDLoU+30C4 U+309A (Semi-voiced Katakana TSU)
839EA5FELoU+30C8 U+309A (Semi-voiced Katakana TO)
83F6A6F8LoU+31F7 U+309A (Semi-voiced small Katakana FU)
8663ABC4LlU+00E6 U+0300 (Accented latin small ae)
8667ABC8LlU+0254 U+0300 (Accented latin small open o)
8668ABC9LlU+0254 U+0301 (Accented latin small open o)
8669ABCALlU+028C U+0300 (Accented latin small turned v)
866AABCBLlU+028C U+0301 (Accented latin small turned v)
866BABCCLlU+0259 U+0300 (Accented latin small schwa)
866CABCDLlU+0259 U+0301 (Accented latin small schwa)
866DABCELlU+025A U+0300 (Accented latin small schwa w/hook)
866EABCFLlU+025A U+0301 (Accented latin small schwa w/hook)
8685ABE5SkU+02E9 U+02E5
8686ABE6SkU+02E5 U+02E9
Function: char->integer char
Function: integer->char n

[R7RS] char->integerは文字charの内部エンコーディングに対応する 整数値を返します。integer->charは数値nと内部エンコーディングが 同じ文字を返します。有効な文字charに対して以下の式は常に真となります。

(eq? char (integer->char (char->integer char)))

註: R7RSでは、これらの手続きはUnicodeコードポイントを扱うとされています。 Gaucheの内部エンコーディングがutf-8noneであればそれに 合致します (noneの場合はU+00ffまでの文字がサポートされます)。 内部エンコーディングがeuc-jpsjisの場合は、 Unicodeコードポイントと文字の変換には下のchar->ucs/ucs->charを 使ってください。

対応する内部エンコーディングを持つ文字が無い数値をinteger->charに渡した 場合の結果は不定です。

Function: char->ucs char
Function: ucs->char n

それぞれ、文字charをUCSコードポイントを表す整数へ変換し、 またUCSコードポイントを表す整数nを文字へと変換する手続きです。

Gaucheの内部文字エンコーディングがUTF-8でコンパイルされている場合は、 これらの手続きはそれぞれchar->integerおよびinteger->char と等価です。

Gaucheの内部文字エンコーディングがUTF-8でない場合、 これらの手続きはgauche.charconvモジュールを使って 内部文字コードとUCSとの変換を行います (文字コード変換参照)。 charが対応するUCSコードを持っていない場合、char->ucs#fを 返します。UCSコードnに対応する文字が内部エンコーディングで定義されていない 場合、変換ルーチンが代替文字を提供していればそれを、そうでなければ#f が返されます。

Function: char-upcase char
Function: char-downcase char
Function: char-titlecase char
Function: char-foldcase char

[R6RS][R7RS] charの大文字、小文字、titlecase、foldcaseを それぞれ返します。

変換は原則としてUnicodeで定義された文字対文字のマッピングに従います。 Unicodeに従って変換する先の文字が内部エンコーディングでサポートされていない 場合は、変換は行いません。内部エンコーディングが’none’の場合は、 文字をLatin-1 (ISO-8859-1) であるとみなします。Latin-1の small y with diaresis (U+00ff) をupcaseすると、 内部エンコーディングがutf-8の場合はcapital y with diaeresis (U+0178)にマップされますが、 内部エンコーディングがnoneであれば元の文字がそのまま返されます。

R7RSはchar-titlecaseを定義していません。それ以外の3つの手続きは (scheme char)ライブラリにあります。R6RSは全ての手続きを提供しています。

文字対文字のマッピングでは、一文字が複数文字に展開されるようなケースマッピングは 扱いません。有名な例はeszett (latin small letter sharp S, U+00df)で、 文字列のコンテキストでは二つの大文字のSへとマップされますが、 char-upcase #\ß は単に #\ß を返します。 完全なマッピングが必要なら、gauche.unicodeモジュールの string-upcase等が利用できます (Full string case conversion参照)。

Function: digit->integer char :optional (radix 10) (extended-range? #f)

文字charradix進数の数字を構成するのに有効な文字であれば、 対応する整数が、そうでなければ#fが返されます。

(digit->integer #\4) ⇒ 4
(digit->integer #\e 16) ⇒ 14
(digit->integer #\9 8) ⇒ #f

省略可能引数extended-range?に真の値が与えられると、 この手続きはASCIIの数字だけでなく、Ndカテゴリに属する すべての文字、例えば FULLWIDTH DIGIT ZEROからNINE (U+ff10 - U+ff19) も認識します。

R7RSにはdigit-valueという手続きが定義されていて、それは (digit->integer char 10 #t)と等価です。

Common Lispには同様の手続きがdigit-char-pというやや曖昧な名で定義されています。

Function: integer->digit integer :optional (radix 10) (basechar1 #\0) (basechar2 #\a)

digit->integerの逆です。整数integerradix進数 ひと桁で 表現するのに使われる文字を返します。integerがひと桁で表現できない数値の場合は #fが返されます。

(integer->digit 13 16) ⇒ #\d
(integer->digit 10) ⇒ #f

省略可能引数basechar1はゼロに相当する文字を指定します。 デフォルトは#\0です。ここに、例えばU+0660 (ARABIC-INDIC DIGIT ZERO) を与えれば、整数をアラビア・インド数字に変換できます。

もうひとるの省略可能引数basechar2は、10を越える整数に使う文字の起点を 指定します。デフォルトは#\aです。ここに#\Aを渡せば、 16進数表記で小文字のかわりに大文字を使うようになります。

Common Lispのdigit-charに当たります。

Function: gauche-character-encoding

コンパイル時に選択された内部文字エンコーディングを表すシンボルを返します。 返される値は以下のいずれかです。

euc-jp

EUC-JP

utf-8

UTF-8

sjis

Shift JIS

none

マルチバイトキャラクタをサポートしない(8ビット固定長文字)。

コンパイル時に内部エンコーディングによってコードを切り替えたい場合は、 機能識別子gauche.ces.*が使えます。 プラットフォーム依存の機能を見てください。

Function: supported-character-encodings

ネイティブなマルチバイトエンコーディングスキームでサポートされている 文字エンコーディングスキームの名前を表す文字列のリストを返します。


Next: , Previous: , Up: 組み込みライブラリ   [Contents][Index]