Appendix B — 文字コードとエンコーディング

文字コードとはコンピュータが文字を扱うために文字に対して割り当てられた数値のことを言う。コンピュータ上で文字を表記するためにこれらの文字コードと実際の文字を対応付けが行われており、この対応付けを行う機構をエンコードと呼ぶ。文字コードでは、どの文字をコードによって表現するかを「文字集合」として規定しており、扱う文字の範囲によって利用される文字集合の規格が異なる。例えば、文字集合規格の基礎となっているASCIIコード (ISO-646)は半角英数字や一部の記号を表現するために規定されている。ASCIIコードでは平仮名や片仮名といった文字は範囲に含まれていないため、日本語が含まれているファイルをASCIIコードによって開いてしまうと文字化けを起こしてしまう。

RではASCIIだけでなく多種多様な文字を出力するための仕組みとして、ASCIIの拡張であり、欧米圏での文字を範囲に含めたLatin1 (ISO 8859-1)および多言語文字に対応したUTF-8 (ISO/IEC 10646)といった文字集合規格を標準でサポートしている。

一つの例を見てみよう。アクセント記号として用いられる「Ä」や「é」といった文字はASCIIではサポートされていないが、Latin1やUTF-8で扱われる文字となっている。そこで関数Encoding()によって文字コードのエンコード方法(エンコーディング)を確認してみる。

(x <- "\U00C4")
[1] "Ä"
[1] "UTF-8"
(x <- "\U00E9")
[1] "é"
[1] "UTF-8"

またEncoding()では文字列に対してエンコーディングを指定することも可能であり、latin1UTF-8あるいはbytesというエンコードを直接与えることができる。byteはバイト表記との互換のために利用される。

(x <- "Ä")
[1] "Ä"
Encoding(x) <- "bytes" # バイト表記のエンコードを指定する
# エンコードした文字を出力。
#   バックスラッシュ記号を表現するためにバックスラッシュが繰り返し出力される
x
[1] "\\xc3\\x84"
# バイト表記から文字として出力
(x <- "\xc3\x84")
[1] "Ä"
x <- "あ"
Encoding(x) <- "latin1" # latin1としてエンコードする
x
[1] "ã<81>‚"
# latin1では日本語の「あ」を表現するための文字コードが存在しない
(x <- "ã\u0081\u0082")
[1] "ã\u0081\u0082"

B.0.0.1 エンコードの変換

Rで利用可能な文字コードはiconvlist()関数を用いて出力することができる。ここで出力される文字集合は、ファイル読み込みの際にエンコードを指定するものと共通のものである。これらの文字集合から、関数iconv()によって指定の文字集合に対応したエンコードを実行できる。

# 文字集合規格の一部と数を出力
x <- iconvlist()
x[392:401]
 [1] "UTF-16"    "UTF-16BE"  "UTF-16LE"  "UTF-32"    "UTF-32BE"  "UTF-32LE" 
 [7] "UTF-7"     "UTF-8"     "UTF-8-MAC" "UTF8"     
[1] 419
# 引数fromとtoそれぞれに変換前後の文字コードを指定する
iconv("\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8", from = "CP932", to = "UTF-8")
[1] "あいうえお"

上記の例で利用したCP932とは日本で使われる文字コードの一種であり、主にマイクロソフト社のコンピュータで利用されていたものであった。そのため、現在でもマイクロソフト社のOSを使用したコンピュータで作成されたファイルはCP932によるエンコードが行われていることがしばしばある。その他、日本語を取り扱うために整備されている文字コードの例を以下に示す。

# 日本語に関係した主な文字コードのうちRで利用可能なものを検出する
encode.jp <- c("EUC-JP", "ISO-2022-JP", "SJIS", "SHIFT_JIS", "CP932", "UTF8")
is.element(encode.jp, iconvlist())
[1] TRUE TRUE TRUE TRUE TRUE TRUE