コンピューターと現在言われているものは、たいていは「プログラム内蔵式」と言って、プログラムを記憶装置内に蓄えて順次実行していく形式のものです。記憶装置内では電流の有無や電圧の2状態の変化で1と0を表し、その組み合わせて処理を行っていきます。電流の有無や電圧の変化を1と0というように抽象化し、さらに01の羅列だと読みにくいので、4桁ずつ区切って16進数だと解して0~9及びABCDEFとさらに抽象化して扱うのが慣例です。この形式で表現されたプログラムがいわゆる機械語(マシン語)と呼ばれるものです。
ですから現在のコンピューターにおいては、全ては01の組み合わせ(もしくは0~Fの組み合わせ)で表されているのです。
加えて、01の組み合わせもしくは0~Fの組み合わせでは+-の符号のない整数しか本来は表現できませんが、一定の規則に基づいて変換することで整数、小数なども扱うことができますし、文字も扱うことができます。文字について用いられる一定の規則が文字コードです。
一方、機械語を直接書くのはあまりにも大変なので、別のなにかで書いた上で、それを機械語に変換して実行させるのが通例です。一番機械語に近いレベルのものとしてはアセンブリ言語があります。これは機械語とほぼ1対1対応ですが、自然言語に近い語を使用することで機械語よりは多少は楽に書けます。一方抽象度を高めて機械語をあまり意識しなくてもいい言語もあります。Lispは抽象度の高い方の言語で、機械語が全くできなくてもプログラムを書くことが可能になっています。
ErlangはLispよりは抽象度が低い言語で、「文字列の正体は実は数字のリストである」などということは、以上の話がわからないとなかなか理解できないところだと思います。
これを具体的に見ていきましょう。ターミナルからerlもしくはwerlと入力してerlangの対話環境(read-eval-printループ)を起動して
1> $A. 65と入力してください。(最後に . を打つのを忘れずに。)65という数値が返ってきます。 $ の後ろに文字を打つと、その文字のUnicodeによる文字コードの符号なし10進整数値を意味することを表しています。かつてはUnicodeではなくISO-8859-1が用いられていました。ISO-8859-1はISO/IEC 8859-1(もしくはLatin-1という表現もあります)というヨーロッパにおけるラテン文字を広く網羅した文字コードに、ISO/IEC 8859-1では使用していない0x00~0x1Fと0x80~0x9Fの双方に制御文字などのコードを加えたものです。いわゆる1byte=8bitを全部使った文字コードでした。したがって2byte以上の多バイト文字は使用できなかった(プログラマーの方でプログラムとして提供する必要があった)のですが、その後Erlangの言語仕様として多バイト文字の使用が可能になり、文字コードとしてはUnicodeを使用することになりました。とはいえ、ISO-8859-1とUnicodeで上位バイトが0の場合の下位8bitとでは全く違いはありません。
具体的に見てみます。
2> $人. 20154 3> $鳥. 40165なお、この例で数値がもともとかえってこなかったり違う数値がかえってくるようだと、端末の設定がUnicodeになっていない可能性がありますので、今のうちに直しておきましょう。UNIX系たとえばFreeBSDでコンソールを使っている場合には、.cshrcの中でsetenv LANG ja_JP.UTF-8と設定して、source ~/.cshrcとして反映させるという手があります。windowsのwerlだと環境変数LANGにja_JP.UTF-8を設定することになるでしょうか?(なにせ気づいたときにはUTF-8だったので。)
[余談]
数値扱いされるので数値としての処理、典型的なものとしては+-×÷の四則演算もできます。
4> $A + 3. 68 5> $A + $a. 162 6> $人 + $鳥. 60319