文字と文字列

文字列の性質
Wolfram言語の機能は数式等の構造体の操作や処理に重点が置かれている.文字列は構造化されたものではないが,それでも,Wolfram言語を使えば体系的な取扱いが可能である.
"text"
文字列を指定する
文字列の指定
Wolfram言語に文字列を入力するには引用符で文字列をくくっておく必要がある.ただし,Wolfram言語の出力結果では,通常,文字列の引用符は見えないようになっている.
引用符付きの形で文字列を見たいときは入力形で表示する.また,ノートブックから入力しているときは,編集開始と同時に自動的に文字列の引用符が挿入される.
通常のWolfram言語出力では引用符は表示されない:
入力形で表示すると,引用符付きの形で見ることができる:
通常,引用符は表示されないので,違和感なく文字列を式や数値と混合表示できる.
引用符なしで文が表示される:
表示上,文字列"x"は出力でxと同様に映るが,シンボルxとは全く異なるオブジェクトであるので気を付けなければいけない.
文字列"x"とシンボルxは別なものなので等号関係は成り立たない:
オブジェクトが文字列かどうかが不明なときは,その頭部を参照する.文字列であれば,頭部はStringである.
文字列の頭部はStringである:
パターン_Stringを使うとどんな文字列でも探せる:
文字列をパターンマッチングや変換規則の構成要素として使ってもよい.ただし,文字列への値の割当てはできない.
この場合は,文字列を構成要素とした割当てを定義した:
文字列"aa"を変数xに置き換えることも可能である:
文字列の操作
Wolfram言語は,文字列の操作のための関数を数多く備えている.その多くは文字列を複数の文字の並びとして扱い,機能的にはリスト操作の関数に対応している.
s1<>s2<>
または
StringJoin[{s1,s2,}]
複数の文字列をつなぎ合せる
StringLength[s]
文字列を構成している文字の総数(長さ)を返す
StringReverse[s]
文字の並び順を反対にする
文字列の一括操作
結合記号<>を使い文字列をつなぎ合せる.文字列はいくつあっても構わない:
StringLengthを使って文字列の長さを調べる:
StringReverseを使い構成文字の並び順を逆にする:
StringTake[s,n]
文字列 s から最初の n 文字を抽出し新たな文字列を構成する
StringTake[s,{n}]
文字列 s の先頭から数えて n 番目の文字を抽出し長さ1の文字列を構成する
StringTake[s,{n1,n2}]
文字列 s から n1 ~ n2 番目の文字を抽出し新たな文字列を構成する
StringDrop[s,n]
文字列 s から最初の n 文字を除去し残った文字を抽出し新たな文字列を構成する
StringDrop[s,{n1,n2}]
文字列 s から n1 ~ n2 番目の文字を除去し残った文字を抽出し新たな文字列を構成する
文字列の部分抽出
文字列の抽出関数StringTakeStringDropはリストの抽出関数であるTakeDropに対応している.TakeDropと同じように,引数の指定の仕方はWolfram言語標準規定に準拠している.したがって,文字列末尾から数えた文字の位置は負の数で表す.また,文字列の先頭位置は1である.
長い文字列を入力しておく:
alphaから最初の文字を5個抽出する:
今度は,alphaの先頭から数えて5番目の文字だけを抽出する:
後ろから数えて2〜10番目の文字を取り除いて残った文字を抽出する:
StringInsert[s,snew,n]
文字列 sn 番目の位置に新たな文字列 snew を挿入する
StringInsert[s,snew,{n1,n2,}]
文字列 sn1 ~ n2 番目の各位置に新たな文字列 snew を挿入する
文字列の挿入
文字列 sn 番目に新たな文字列 snew を挿入するには書式StringInsert[s,snew,n]を使う.
文字列の4番目に文字列"XX"を挿入することで文字列を新たに作る:
挿入位置に負の値を指定すると末尾から数えた位置を指定することになる:
3つの複数位置に"XXX"の同じ文字列を挿入する:
Riffleを使い単語の間にスペースを挿入する:
StringReplacePart[s,snew,{m,n}]
文字列 s において m ~ n 番目の文字を新たな文字列 snew に置換する
StringReplacePart[s,snew,{{m1,n1},{m2,n2},}]
文字列 s の数個の部分文字列を snew で置換する
StringReplacePart[s,{snew1,snew2,},{{m1,n1},{m2,n2},}]
文字列 s の部分文字列を対応する snewi で置換する
文字列の部分的置換
2番目から6番目までの文字を"XXX"に置き換える:
2つの部分を"XXX"に置き換える:
今度は,置換部分は2つだが,別々の文字列で置換する:
StringPosition[s,sub]
文字列 s において部分列 sub が現れる開始位置と終了位置をリスト出力する
StringPosition[s,sub,k]
文字列 s において現れる最初の k 個までの部分列 sub の開始位置と終了位置をリスト出力する
StringPosition[s,{sub1,sub2,}]
文字列 s において各部分列 subi の開始位置と終了位置をリスト出力する
文字列の部分検索
StringPositionを使い,1つの被検索文字列に別の検索文字列が含まれているか照合できる.検索文字列と同じ内容を持つ範囲(複数可)がリストとして返される.範囲とは開始点と終了点の位置のことである.このリスト出力による範囲指定の仕方はStringTakeStringDropStringReplacePartで使われる指定法と同じである.
文字列の中に部分列"abc"があるかどうか調べる.あると,その範囲がリストで返される:
第1番目の"abc"がある範囲だけに限定する:
今度は,"abc""cd"の両方がある場所を示す.デフォルトでは重複するものが含まれる:
これは重複するものを含まない:
StringCount[s,sub]
s 中の sub の出現回数を数える
StringCount[s,{sub1,sub2,}]
任意の subi の出現回数を数える
StringFreeQ[s,sub]
ssub が含まれていないかどうかを検証する
StringFreeQ[s,{sub1,sub2,}]
ssubi が全く含まれていないかどうかを検証する
StringContainsQ[s,sub]
ssub が含まれるかどうかを検証する
StringContainsQ[s,{sub1,sub2,}]
ssubi のいずれかを含むかどうかを検証する
StringStartsQ[s,sub]
ssub で始まるかどうかを検証する
StringStartsQ[s,{sub1,sub2,}]
ssubi のいずれかで始まるかどうかを検証する
StringEndsQ[s,sub]
ssub で終わるかどうかを検証する
StringEndsQ[s,{sub1,sub2,}]
ssubi のいずれかで終わるかどうかを検証する
部分文字列の検証
これはどちらかの文字列の出現回数を数える.デフォルトで,重複は含まれない:
StringReplace[s,sb->sbnew]
文字列 s において部分列 sb を文字列 sbnew で置換する
StringReplace[s,{sb1->sbnew1,sb2->sbnew2,}]
sbi を対応する sbnewi で置換する
StringReplace[s,rules,n]
最高で n 回置換する
StringReplaceList[s,rules]
可能な置換を行って得られた文字列のリストを与える
StringReplaceList[s,rules,n]
最高で n 個の結果を与える
変換規則を使った文字列の部分的置換
文字列aと同じ部分のすべてが置換文字列XXに置き換わる:
今度は,abcYで置換し,dXXXで置換する:
被検索文字列における最初のcdeの部分はabcの部分と重なっているので置換の対象にならない:
StringReplaceは,文字列を左から右へスキャンし,できる限りすべての置換を行い,結果の文字列を返す.しかし,場合によっては1文字列につき置換を1つだけ行うことが可能な場合をすべて考慮することも有効である.StringReplaceListは,可能な限りの単一の置換の全結果をリストで与える.
これは,各aを置換した結果のリストを与える:
これは,すべての可能な単一置換の結果を示す:
StringSplit[s]
s を空白文字で区切られた部分文字列に分割する
StringSplit[s,del]
del のところで分割する
StringSplit[s,{del1,del2,}]
deli のところで分割する
StringSplit[s,del,n]
最高で n 個の部分文字列に分割する
文字列の分割
空白ごとに文字列を分割する:
これは"::"ごとに文字列を分割する:
これはコロンあるいは空白ごとに文字列を分割する:
StringSplit[s,del->rhs]
各区切り位置に rhs を挿入する
StringSplit[s,{del1->rhs1,del2->rhs2,}]
rhsi を対応する deli の位置に挿入する
文字列分割の区切りの置き換え
これは,各::区切りに{x,y}を挿入する:
Sort[{s1,s2,s3,}]
文字列のリストを並べ替える
文字列の並べ替え
Sortは,標準的順序(アルファベット順)に並べ替える:
StringTrim[s]
s の始めと終りから空白を取り除く
StringTrim[s,patt]
最初と最後から patt にマッチする部分文字列を取り除く
文字列の両端から空白を取り除く:
SequenceAlignment[s1,s2]
s1s2の最適な配列を求める
2つの文字列の最適な配列を求める:
文字列と構成文字
Characters["string"]
文字列を文字成分のリストに変換する
StringJoin[{"c1","c2",}]
文字成分のリストを文字列に変換する
文字成分への分解と文字列の再構成
文字列を構成する文字成分を列挙させる:
リスト形式にしたので標準リスト操作機能を使い変形操作ができるようになる.ここでは,左回転する:
StringJoinを使って並べ替えた文字成分から単一文字列を再構成する:
DigitQ[string]
文字列の内容がすべて数字かどうか判定する
LetterQ[string]
文字列の内容がすべてアルファベット文字かどうか判定する
UpperCaseQ[string]
文字列の内容がすべてアルファベットの大文字かどうか判定する
LowerCaseQ[string]
文字列の内容がすべてアルファベットの小文字かどうか判定する
文字列成分の型判定
文字列の成分すべてがアルファベット文字である:
大文字だけではないので,答はFalseになる:
ToUpperCase[string]
文字列の成分をすべて大文字に変換する
ToLowerCase[string]
文字列の成分をすべて小文字に変換する
文字列の大文字・小文字変換
すべての文字を大文字に変換する:
CharacterRange["c1","c2"]
c1から c2の範囲にある文字を順番に生成しリストにする
連番文字の生成
小文字のアルファベット順に列挙させる:
大文字のアルファベット順の場合:
数字の場合:
日常使う文字の範囲であればCharacterRangeを使うと意味のある並び順で文字が生成できる.CharacterRangeの並び順とは,Wolfram言語内部で各文字の持つ文字コードで小さい順に並べるということである.
大文字から小文字の範囲にある文字を内部文字コード順に列挙する:
文字列パターン
StringReplaceのような文字列操作関数には,文字通りの文字列だけでなく,文字列の集合を表すパターンも扱えるという重要な機能がある.
これはbまたはcXで置換する:
これは,任意の文字をuで置換する:
文字列パターンは,通常の文字列とWolfram言語の記号的なパターンオブジェクトが混ざった「文字列式」を使って指定することができる.
s1~~s2~~
または
StringExpression[s1,s2,]
一連の文字列とパターンオブジェクト
文字列式
これは文字列abに任意の単一文字が続く文字列式を表す:
これは,この文字列パターンがあるごとに置き換える:
StringMatchQ["s",patt]
"s"patt にマッチするかどうか検証する
StringFreeQ["s",patt]
"s"patt にマッチする部分文字列がないかどうか検証する
StringContainsQ["s",patt]
"s"patt にマッチする部分文字列を含むかどうかを検証する
StringStartsQ["s",patt]
"s"patt にマッチする部分文字列で始まるかどうかを検証する
StringEndsQ["s",patt]
"s"patt にマッチする部分文字列で終わるかどうかを検証する
StringCases["s",patt]
patt にマッチする"s"の部分文字列のリストを与える
StringCases["s",lhs->rhs]
lhs があるごとに rhs で置換する
StringPosition["s",patt]
patt にマッチする文字列の位置のリストを与える
StringCount["s",patt]
patt にマッチする部分文字列がいくつあるか数える
StringReplace["s",lhs->rhs]
lhs にマッチするすべての部分文字列を置換する
StringReplaceList["s",lhs->rhs]
lhs を置換するすべての方法のリストを与える
StringSplit["s",patt]
patt にマッチするすべての部分文字列のところでs を分割する
StringSplit["s",lhs->rhs]
lhs の位置で区切り,代りに rhs を挿入する
文字列パターンをサポートする関数
これは,文字列に現れるこのパターンのすべてを返す:
これは,"ab"文字列の後に現れる各文字を与える:
これは,文字列中の同一文字ペアすべてを与える:
文字列パターンでは,すべての標準的なWolfram言語のパターンオブジェクトが使用できる.単一ブランク(_)は常に単一文字を表す.二重ブランク(__)は1つまたはそれ以上の連続した文字を表す.
単一のブランク(_)は任意の1文字を表す:
二重のブランク(__)は1つまたはそれ以上の任意の文字の連続を表す:
三重のブランク(___)は零個または1つ以上の文字の連続を表す:
"string"
文字通りの文字の列
_
任意の単一文字
__
1つ以上の文字を持った任意の文字列
___
零個あるいは1つ以上の文字を持つ任意の文字列
x_
,
x__
,
x___
x という名前を与えられた部分文字列
x:pattern
x という名前を与えられた部分文字列
pattern..
1回以上繰り返されたパターン
pattern...
繰り返された,あるいは繰り返されなかったパターン
{patt1,patt2,}
または
patt1|patt2|
少なくとも patti のひとつにマッチするパターン
patt/;cond
cond を評価するとTrueになるパターン
pattern?test
各文字についての testTrueを返すパターン
Whitespace
一連の空白文字
NumberString
数の文字
charobj
文字のクラスを表すオブジェクト(以下参照)
RegularExpression["regexp"]
正規表現にマッチする部分文字列
文字列パターンのオブジェクト
これは,コロンまたはセミコロンのところで分割する:
これは,aまたはbのみの連続を求める:
代替物が文字列パターンのリストで与えられる:
Characters["c1c2"]CharacterRange["c1","c2"]のような標準的なWolfram言語の構文を使って文字列パターンで使う代替文字のリストを生成することができる.
これで文字のリストが与えられる:
これで母音文字が置換される:
これは"A"から"H"までの間にある文字を与える:
可能な文字のクラスを指定することに加え,Wolfram言語は次のように文字列パターン中の可能な文字のクラスを記号的に指定する方法を提供している.
{"c1","c2",}
任意の"ci"
Characters["c1c2"]
任意の"ci"
CharacterRange["c1","c2"]
"c1"から"c2"の範囲に含まれる任意の文字
DigitCharacter
0から9までの数字
LetterCharacter
文字
WhitespaceCharacter
スペース,改行,タブあるいはその他の空白文字
WordCharacter
文字あるいは数字
Except[p]
p にマッチするもの以外の任意の文字
文字クラスの指定
これは文字列中の数字を取り出す:
これは数字以外のすべての文字を取り出す:
これは1つあるいは2つ以上連続した数字をすべて取り出す:
結果は文字列である:
これは上記の文字列を数字に変換する:
文字列パターンは,よく一連のテキストデータから構造を取り出す方法として使われる.これは一般に,文字列パターンの異なる部分を構造の異なる部分に対応する部分文字列にマッチさせることで行われる.
これは,=に数字が続いたものを取り出す:
これは数字のみを与える:
これは「変数」と「値」を文字列から抽出する:
ToExpressionがこれらを通常の記号と数字に変換する:
多くの場合,テキストデータはスペース,改行,タブを含んでいる.これらは「空白文字」とみなされるべきであるが,往々にして無視される.では,,そのような文字列はWhitespaceで表される.
これは,すべての空白文字を文字列から取り除く:
これはスペースが連続するたびに,これを単一のコンマで置換する:
通常文字列パターンは,指定の文字列の任意の位置の部分文字列に適用される.しかしときによっては,特定の位置の部分文字列のみにパターンを適用するように指定できると便利なこともある.そのような場合は,StartOfStringのような記号を文字列パターンに含めるとよい.
StartOfString
文字列全体の先頭
EndOfString
文字列全体の末尾
StartOfLine
行頭
EndOfLine
行末
WordBoundary
単語文字とそれ以外の境界
Except[StartOfString]
特定の位置StartOfString等以外の任意の場所
文字列中の特別な位置を表す構文
これは,"a"が文字列のどこに現れてもこれを置換する:
これは,"a"が文字列の先頭に現れた場合にのみこれを置換する:
これは部分文字列"the"をすべて置換する:
これは,前後に単語の境界がある場合にのみ置換する:
文字列パターンは,通常のWolfram言語のパターンのように,/;と同類のものやこの他の条件を許容する.
これは,文字列中で異なる文字が続く場合を与える:
文字列パターンでx__あるいはe..のようなオブジェクトを与えると,通常Wolfram言語は可能な文字列のうちでマッチする最長のものが要求されていると解釈する.しかし,場合によっては可能な文字列のうちでマッチする最短のものがほしい場合もある.そのような場合はShortest[p]を使って指定することができる.
Longest[p]
p にマッチする最長のもの(デフォルト)
Shortest[p]
p にマッチする最短のもの 
最長と最短のマッチを表すオブジェクト
デフォルトにより,文字列パターンはマッチする可能な文字列の中で最長のものを求める:
Shortestは,その代りにマッチする最短のものを求めるように指定する:
Wolfram言語はデフォルトにより文字"X"と文字"x"異なるものとして扱う.しかし,文字列操作のIgnoreCase->Trueオプションを設定することで,Wolfram言語にこのような大文字と小文字を等しいものとして扱うように指示することができる.
IgnoreCase->True
大文字と小文字を等しいものとして扱う
大文字小文字を無視した文字列操作の指定
これは,すべての"the"を大文字小文字に関わらず置換する:
文字列操作によっては,部分文字列の重複を含めるかどうかを指定しなければならないことがある.デフォルトのStringCasesStringCountでは重複は含まれないが,StringPositionは重複を含む.
これは,デフォルトで重複は除きながら連続する文字のペアを拾い出す:
こちらは重複も含める:
StringPositionは,デフォルトで重複を含む:
Overlaps->All
すべての重複を含む
Overlaps->True
各位置から初めて少なくともひとつの重複を含む
Overlaps->False
すべての重複を除く
文字列中の重複の操作に関するオプション
これは1つのマッチした返さない:
これは重複するマッチを連続して返す:
これは可能なすべての重複するマッチを含む:
正規表現
一般的なWolfram言語のパターンは,文字列操作のための強力な方法を提供する.しかし,特殊な文字列操作言語に精通している場合には,「正規表現」記号を用いて文字列パターンを指定したいと思うことがあるだろう.そのような場合,Wolfram言語ではRegularExpressionオブジェクトを用いる.
RegularExpression["regex"]
"regex" で指定する正規表現
Wolfram言語で正規表現表記を用いる
すべてのaあるいはbを置換する:
通常のWolfram言語文字列パターンを用いて同様の操作を指定する:
正規表現と一般のパターンを混ぜて使うこともできる:
Wolfram言語のRegularExpressionは,標準的な正規表現のコンストラクトすべてをサポートする.
c
そのままの文字 c
.
改行以外の任意の文字
[c1c2]
ci の任意の文字
[c1-c2]
c1c2の範囲の任意の文字
[^c1c2]
ci 以外の任意の文字
p*
繰り返されたあるいは繰り返されない p
p+
繰り返された p
p?
p があるかないか
p{m,n}
m 回からn 回繰り返された p
p*?
,
p+?
,
p??
マッチする最短の文字列
(p1p2)
p1p2にマッチする文字列
p1|p2
p1あるいは p2にマッチする文字列
Wolfram言語正規表現の基本的なコンストラクト
これは,指定された正規表現式にマッチする部分文字列を見付ける:
これは,一般的なWolfram言語の文字列パターンを使って同様の操作を行う:
多くの正規表現コンストラクトと基本的な一般的Wolfram言語文字列パターンコンストラクトとの間には,密接な対応関係がある.
._
(厳密に
Except["n"]
[c1c2]Characters["c1c2"]
[c1-c2]CharacterRange["c1","c2"]
[^c1c2]Except[Characters["c1c2"]]
p*p...
p+p..
p?p|""
p*?
,
p+?
,
p??
Shortest[p],
(p1p2)(p1~~p2~~)
p1|p2p1|p2
正規表現と一般的な文字列パターンコンストラクトとの対応関係
一般的なWolfram言語の文字列パターンに見られるように,種々の文字の一般的なクラスを表す正規表現の表記法もある.Wolfram言語の正規表現文字列にこれらの記号を入れる際には,二重のバックスラッシュ()を使わなければならないので注意のこと.
\\d
0から9までの数字( DigitCharacter )
\\D
数字以外( Except[DigitCharacter] )
\\s
空白,改行,タブ,その他の空白文字( WhitespaceCharacter )
\\S
空白文字以外( Except[WhitespaceCharacter] )
\\w
文字記号(文字,数字,あるいは _(WordCharacter)
\\W
非文字記号( Except[WordCharacter] )
[[:class:]]
名前付きクラス内の記号
[^[:class:]]
名前付きクラスには含まれない記号
文字記号のクラスに対応する正規表現表記
これは,aに数字が続くものを与える:
これは,上と同様のことを一般的なWolfram言語の文字列パターンで行うものである:
Wolfram言語は,標準的なPOSIX文字クラスのalnumalphaasciiblankcntrldigitgraphlowerprintpunctspaceupperwordxdigitをサポートする.
これで,一連の大文字を求める:
これは,上記と同じことをする:
^
文字列の先頭 (StartOfString)
$
文字列の末尾 (EndOfString)
\\b
単語の境界 (WordBoundary)
\\B
単語の境界以外の任意の場所 (Except[WordBoundary])
文字列中の位置を表す正規表現表記
一般なWolfram言語のパターンでは,x_x:patt のようなコンストラクトを使って,マッチするオブジェクトに任意の名前を与えることができる.正規表現では,数字を使ってこれと同じようなことをする方法がある.正規表現中の n 番目のカッコに入ったパターンオブジェクト(p)は,パターン本体内では\\n として,パターンの外では$n として参照することができる.
これは,一緒に現れる同一文字のペアを求める:
こちらは,一般的なWolfram言語の文字列パターンを使って同様のことをする:
$1(.)に一致する文字を参照する:
これはWolfram言語のパターンバージョンである:
文字列の中の特殊文字
文字列を構成する成分としては,標準キーボードが用意している文字や記号の他に,Wolfram言語が独自に提供する特殊文字も使うことができる.
特殊文字を使い文字列を構成する:
普通の文字列を扱うように特殊文字も扱える:
文字成分に分解する:
ノートブックを使っている場合は, 等のギリシャ文字も直接表示できる.しかし,テキスト型インターフェースを使っている場合は,通常表示できるのはキーボードにある文字や記号だけである場合が多い.厳密にどの特殊文字が表示できるかは$CharacterEncodingの値で分かる.
直接表示できない場合は,形の似た標準文字をいくつか選び組み合せることで特殊文字に似せる.その方法もうまくいかない場合は,特殊文字の英語読みスペルで記述する.
Wolframシステムのノートブックでは,StandardFormを使って特殊文字を直接表示することができる:
OutputForm(出力形)の表示では,正確に表示できない特殊文字は可能な限り普通の文字や記号を組み合せて作ったもので代替表示が行われる:
InputFormFullFormが使われている場合,特殊文字に近似のものが使われることはない.Wolfram言語はInputFormの表現できない特殊文字に完全名を使う.一方FullFormはノートブックインターフェースでもロングネームを常に使う.
InputFormでは,符号化の一部でないすべての特殊文字(この場合,é以外の特殊文字)はロングネームを使って書かれる:
FullFormでは,すべての特殊文字がロングネームを使って書かれる:
デフォルトでは,Wolframシステムはノートブックやパッケージを保存するとき文字コード"PrintableASCII"を使う.つまり,特殊文字がファイルや外部プログラムから書き出されていても,純粋に通常の文字列として表現されるということである.この一貫した表現は,Wolfram言語の特殊文字をそれぞれのコンピュータシステムの詳細に依存しないで使えるようにするという点で不可欠である.
パッケージやノートブックを作成する場合,特殊文字は常に完全名を使って書き出される:
"PrintableASCII"を使って特殊文字を含まない文字列を生成する:
InputFormでは,"PrintableASCII"を使っているときすべての特殊文字が完全に書き出される:
a
標準文字セットの文字
\[Name]
特殊文字の英語読みの名前で特殊文字を指定する
\"
文字列の中にダブルクォート"を含める
\\
文字列の中にバックスラッシュ\を含める
文字列の構成要素
ダブルクォート(")やバックスラッシュ(\)を入力文字列の一部として使うには\をその前に付けておく:
\\にすると表示では\になってしまい,この例の最初のAlphaはギリシャ文字の α とは認識されない:
文字列を文字成分に分解する:
α の完全名に含まれる文字を列記させる:
α の完全名から実際の文字列を作る:
文字列の中の改行とタブの指定
n
改行コード
t
タブコード
文字列の中の改行とタブの指定法
入力する文字列は1行だが,改行コードを入れたので,表示では2行になる:
InputFormで見てみると確かに改行コードnが入っている:
Wolfram言語は1つの文字列で入力された改行を保持する:
文字列の内容を確認してみる.分割点が残っている:
行末に1つバックスラッシュがあっても,Wolfram言語は改行を無視する:
タブや改行コードを挿入することでWolfram言語の出力表示をある程度まで制御することは可能である.しかし,あまりよい方法とは言えない.よりよい方法は,「書式付きテキスト表示」「数値の出力書式」「表と行列」で説明されているWolfram言語の上級の書式プリミティブを使う方法である.後者を使えば,デバイス依存を持つタブの設定等に影響を受けずに一様な表示を常に行うことができる.
改行コードのある文字列は常に左揃えで表示する
そこで,フロントエンドの配置構文であるColumnを使って列揃えで表示する.この例では,列の右側に揃えるよう指定する:
同じ関数を使い中央で揃える:
文字コード
ToCharacterCode["string"]
文字列の各文字に対応する文字コードを返す
FromCharacterCode[n]
文字コードから文字を生成する
FromCharacterCode[{n1,n2,}]
文字コードから複数文字(文字列)を生成する
文字と文字コードの変換法
文字列を構成するテキスト文字や記号には,Wolfram言語内部で固有の文字コードが割り当てられる.内部ではこの文字コードをもとに文字列の操作処理が行われる.
文字列を構成する文字成分のそれぞれの文字コードを列挙させる:
FromCharacterCodeからもとの文字列を再構成する:
特殊文字や記号にも固有の文字コードが割り当てられている.いくつかの例を見てみる:
CharacterRange["c1","c2"]
連続する文字コードの文字を順番に生成し列挙する
連番文字の生成
英語の小文字アルファベットの連番部分を列挙させる:
ギリシャ語のアルファベットを列挙させる:
特殊文字や記号の多くは[Alpha]の形の英語読みの名前が割り当てられているので,英語名を使っていつでも参照できる.文字コードをわざわざ使う必要はない.
文字コードの直接参照で,特殊文字と記号を使い文字列を作る:
使った特殊文字に対応する英語名を確認してみる.上の例の文字コードの代りに,これらの英語名を入力に使ってもよい:
Wolfram言語では,数学で使う標準的な特殊文字や記号とヨーロッパの標準的な言語の文字セットにも登録済みの名前が用意されている.しかし,日本語,中国語,韓国語のような言語のためには,何千もの文字が追加されており,明示的な名前は割り当てられていない.このため,漢字等の参照には文字コードを使う必要がある.
漢字を使った文字列の入力例:
FullFormでは,これらの文字は標準文字コードで参照される.標準文字コードは16進法で記述されることに注意:
ノートブック用フロントエンドで文字を入力した場合,文字コードが自動的に使われるようになっている.
しかし,用途によっては,直接文字コードを入力した方が便利なときがある.
.nn
16進法表記の文字(1バイト文字 nn
\:nnnn
16進法表記の文字(2バイト文字 nnnn
\|nnnnnn
16進法表記の文字(3バイト文字 nnnnnn
文字コード参照による文字指定
文字コードが256より小さい1バイトのものであれば\.nn の文字指定の書式が使える.それ以上の値を持つ2バイトの文字コードは書式\:nnnn\|nnnnnn を使わなければならない.いずれの書式を使うにしても,指定桁数のすべてを入力する必要があり,文字コードの値が小さすぎて上位の桁が空になってしまうときは0を補っておく.
文字列にある文字と記号を16進法の文字コードに変換する:
文字コードを文字列に変換する. の文字コードにおいて最上位桁の0に注目:
Wolfram言語の使う文字コードの割当ては,3つのともに互換な標準文字コードの規格に準拠している.その規格とはASCIIとISO Latin1,そして,Unicode規格である.ASCII規格は英語キーボードの文字と記号の文字コード範囲を定義し,また,ISO Latin1規格はヨーロッパの言語で使う特殊文字の範囲を定義する.Unicode規格は前者の規格をさらに一般化し,欧州以外の漢字等の文字セットも定義している.
0127 (.00.7f)
ASCII領域
131 (.01.1f)
ASCII制御文字
32126 (.20.7e)
ASCII印字可能文字
97122 (.61.7a)
英語アルファベット小文字
129255 (.81.ff)
ISO Latin1領域
192255 (.c0.ff)
ヨーロッパ言語の文字セット
059391 (:0000:e7ff)
Unicodeパブリック領域
9131009 (:0391:03f1)
ギリシャ文字セット
1228835839 (:3000:8bff)
中国語,日本語,韓国語の文字セット
84508504 (:2102:2138)
数学記述で使う特殊文字
85928677 (:2190:21e5)
矢印記号
87048945 (:2200:22f1)
数学記述で使う演算記号
6144063487 (:f000:f7ff)
Wolfram言語専用のUnicodeプライベート領域
Wolfram言語の提供する代表的な文字セットと文字コードの対応表
印字可能なASCII文字のすべてを表示する:
ISO Latin1規格の文字セットを表示する:
数学で使う特殊文字を列挙させる.空のボックスで表示されている文字は,現行のフォントに含まれていない:
中国語,日本語,韓国語の範囲の文字である:
外部文字コードの使用
Wolfram言語で特殊文字や記号を入力するには,英語名で参照する方法と,文字コードで参照する方法が使える.例えば, を入力するには,[Alpha]:03b1をタイプする.Wolfram言語から文字列等をファイルに落とすときも,特に指定がなければ,これら2つの書式のどちらかが使われる.
特殊文字と記号によっては,Wolfram言語内部で使う専用文字コード規格ではなく,従来規格の文字コードで指定した方が手っ取り早いときもあるだろう.つまり,英語名や専用16進数文字コードを使うのではなく,オペレーティングシステムの環境およびフォント別に定義してある外部文字コード規格を使うということである.
$CharacterEncoding=None
すべての特殊文字に対して印刷可能なASCII名を使う
$CharacterEncoding="name"
name により指定された外部文字コード規格を使う
$SystemCharacterEncoding
使っているコンピュータシステムのデフォルトの外部文字コード
外部文字コード規格の使用
外部文字コードとは,例えば,キーボードのキーを押したときにオペレーティングシステムから送られてくる生の文字コードのことである.コードの値はそのときに使われている文字コード規格による.
ノートブック用フロントエンドを使っている場合,使っているフォントにより自動的に適切な文字規格が選択されるのでユーザが設定変更する必要はない.テキスト用フロントエンドを使っている場合やファイル処理またはパイプ処理をしている場合,自動設定は行われないので必要ならば$CharacterEncodingを使い設定を手動で変更する.
$CharacterEncodingの機能で適当な規格を指定しておけば,文字コードに依存するテキストエディタやオペレーティングシステムの直接生成する生のテキスト等が直接処理できるようになる.
Wolfram言語専用の文字コード規格で特殊文字と記号を記述してあれば,オペレーティングシステム環境に関係なくWolfram言語で読む限りは確実に文字と記号を再現できる.外部規格を使う場合はこの限りではない.
"PrintableASCII"
印字可能なASCII文字
"ASCII"
制御コードも含むASCII
"ISOLatin1"
西ヨーロッパ言語の文字
"ISOLatin2"
中東部ヨーロッパ言語の文字
"ISOLatin3"
第1ヨーロッパ言語文字補助セット(カタロニア語,トルコ語等)
"ISOLatin4"
第2ヨーロッパ言語文字補助セット(エストニア語,グリーンランド語等)
"ISOLatinCyrillic"
英語・キリル文字セット
"AdobeStandard"
PostScriptフォント用Adobe文字コード規格
"MacintoshRoman"
Macintoshローマンフォント用文字コード規格
"WindowsANSI"
Windowsフォント用文字コード規格
"Symbol"
記号フォント用文字コード規格
"ZapfDingbats"
Zapf dingbats文字コード規格
"ShiftJIS"
シフトJIS日本語文字コード規格(8,16ビットコード混在)
"EUC"
拡張Unix日本語文字コード規格(8,16ビットコード混在)
"UTF8"
Unicode規格(UTF8形式)
Wolfram言語で扱える外部文字コード規格の一覧
どの外部文字コード規格が適切かといった指定はオペレーティングシステムの環境設定や使用言語に応じて Wolframシステム内部で設定済みである.Wolframシステムノートブックインターフェースとコンピュータ上のユーザインターフェース環境との間で文字をコピーするには,通常その環境にネイティブの文字コード規格が使われる.ネイティブのコード規格に含まれていないWolfram言語文字はWolfram言語専用規格の英語名もしくは16進数コードで記述される.
Wolfram言語カーネルは,テキストファイルを書いたり読んだりするときに,指定されたどのような文字コード規格も使うことができる.デフォルトでは,PutPutAppendにより,Wolfram言語ファイルを1つのシステムから別のシステムへと確実に移植するためのASCII表現が生成される.
ファイルtmpに文字列を書き出してみる:
特殊文字は,デフォルトで英語名または明示的な16進数コードで記述される:
Wolfram言語のサポートする外部文字コード規格には1バイト(8ビット長)と2バイト(16ビット長)がある."ISOLatin1"等の規格は1バイト文字だけで構成されるが,"ShiftJIS"は2バイト文字が主体になっている.
Wolfram言語のサポートする外部文字コード規格において,そのほとんどはASCII規格を取り込んだ形で定義されている.したがって,それらの外部規格を使う限りは,文字列[:を使った特殊文字の指定が有効である.
ASCII規格に準拠していない文字コード規格には,例えば,"Symbol"で指定される記号文字コード規格がある.この文字コード規格では,ASCIIアルファベットのaはギリシャ文字 になり,b になる.
英語アルファベットのいくつかをASCIIコード列挙する:
同じ文字コードを"Symbol"規格で見ると,ギリシャ文字として扱われていることが分かる:
ToCharacterCode["string"]
文字列の各文字をWolfram言語標準規格の文字コードで列挙する
ToCharacterCode["string","encoding"]
文字列の各文字を指定外部規格の文字コードで列挙する
FromCharacterCode[{n1,n2,}]
リスト入力した文字コードに対応する Mathematica 標準規格の文字を生成する
FromCharacterCode[{n1,n2,},"encoding"]
リスト入力した文字コードに対応する外部規格の文字を生成する
内部および外部文字コード規格を使った文字と文字コードの変換
文字や記号に対応したWolfram言語内部規格の文字コードを列挙させる:
Macintoshの文字コードと比べる:
Windowsの文字コードはどうであろうか.Windowsのローマン規格には[Pi]はマップされていないことが分かる:
Wolfram言語内部で使う文字規格はUnicodeに準拠している.ただ,外部とのやり取りでは,通常,ASCIIコードだけが使われる.特殊文字や記号も,[Name]:nnnn の書式に基づいたASCII記述が使われる.また,"UTF-8"文字コードをあらかじめ指定しておけば,ファイルをUnicode準拠のテキスト(2バイト文字)として読み込ませることは可能である.