R入門
文字と文字列
最終更新:
r-intro
目次
基本操作
文字列型ベクトルを作成する
文字列を二重引用符”で囲んで文字列リテラルを作り、c関数でベクトル化して代入演算子<-で代入する。
> s <- "ABC"
> print(s)
[1] "ABC"
> s <- c("ABC", "あいう", "阿伊宇abc")
> print(s)
[1] "ABC" "あいう" "阿伊宇abc"
文字型ベクトルの宣言と初期化
文字や文字列を扱うための変数(ベクトル)を使うには、その文字列を格納する領域を用意して、それに名前を付ける必要がある。これを宣言という。
二重引用符”で囲んだ文字の並びを文字列リテラルといい、この文字列リテラルをc関数などを使うことにより宣言する。二重引用符の間に何も含まれない場合は、長さ0の文字列となる。
> s
エラー: オブジェクト 's' がありません
> s <- "あいう"
> print(s)
[1] "あいう"
> s <- c("A", "AB", "", "あ")
> print(s)
[1] "A" "AB" "" "あ"
character関数に数値を与えると、長さが0の文字列を指定した個数だけ作成する。文字列を1つも含まない文字型ベクトルを作るには引数に0を与える。ベクトルの長さを得るにはlength関数を使う。
> length(c("A", "AB", "あ", "z"))
[1] 4
> character(3)
[1] "" "" ""
> length(character(3))
[1] 3
> character(0)
character(0)
> length(character(0))
[1] 0
文字列の長さを得る
nchar関数を使う。typeオプションに指定したいずれかの値で結果が変わる。なお、以下はWindows版で実行している。
- bytes…バイト数
- chars…文字の個数
- width…画面表示される文字の幅(いわゆる半角は1、全角は2)
> s <- c("ABC", "あいう", "阿伊宇abc")
> nchar(s, type = "bytes")
[1] 3 6 9
> nchar(s, type = "chars")
[1] 3 3 6
> nchar(s, type = "width")
[1] 3 6 9
bytesとwidthは同じに見えるが、それはWindows環境下では日本語文字が1文字当たり2バイトだからであり、例えばutf-8(1文字3バイト)であれば以下のようになる。Windows環境下であるので一部は動作しない。
> s <- iconv("あ亜", from = "CP932", to = "utf-8")
> charToRaw(s)
[1] e3 81 82 e4 ba 9c
> nchar(s, type = "bytes")
[1] 6
> nchar(s, type = "chars")
nchar(s, type = "chars") でエラー: invalid multibyte string, element 1
> nchar(s, type = "width")
[1] NA
文字列を連結する
paste関数を使う。オプションを特に指定しないと空白(0x20)で引数に与えた文字列リテラルを連結する。単純に連結したいのであればsepオプションに""を指定する。
> s1 <- "ABC"
> s2 <- "あいう"
> s3 <- "阿伊宇abc"
> paste(s1, s2, s3)
[1] "ABC あいう 阿伊宇abc"
> paste(s1, s2, s3, sep = "")
[1] "ABCあいう阿伊宇abc"
文字列を連結する
paste関数を使う。オプションを特に指定しないと空白(0x20)で引数に与えた文字列リテラルを連結する。単純に連結したいのであればsepオプションに""を指定する。
> s1 <- "ABC"
> s2 <- "あいう"
> s3 <- "阿伊宇abc"
> paste(s1, s2, s3)
[1] "ABC あいう 阿伊宇abc"
> paste(s1, s2, s3, sep = "")
[1] "ABCあいう阿伊宇abc"
paste0関数を使ってもよい。paste0関数はpaste関数のsepオプションがデフォルトで""を指定された状態で実行される。
> paste(s1, s2, s3, sep= "")
[1] "ABCあいう阿伊宇abc"
> paste0(s1, s2, s3)
[1] "ABCあいう阿伊宇abc"
paste関数もpaste0関数も、引数は文字列に強制変換してから処理する(最初にas.character関数を使用するのと同等)。
> paste(1:10)
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
> paste(c(1.1, 2.2, -3.3, 4.44))
[1] "1.1" "2.2" "-3.3" "4.44"
引数の処理は少々複雑で、与えた引数の文字列ベクトルを連結することもできるし、その文字列ベクトル内の文字列を連結させることもできる。前者の区切り文字はsepオプションに、後者の区切り文字はcollapseオプションに指定する。二つを同時にも処理することができる。
> s1 <- c("ABC", "123", "あいう")
> s2 <- c("DEF", "456", "えお")
> paste(s1, s2, sep = "")
[1] "ABCDEF" "123456" "あいうえお"
> paste(s1, s2, sep = "", collapse = "")
[1] "ABCDEF123456あいうえお"
> paste(s1, s2, sep = ";", collapse = "@")
[1] "ABC;DEF@123;456@あいう;えお"
> paste0(s1, s2, collapse = "")
[1] "ABCDEF123456あいうえお"
> paste0(s1, s2, collapse = "@")
[1] "ABCDEF@123456@あいうえお"
文字列を比較する
==演算子を使う。完全に一致すればTRUE、一文字でも異なればFALSEを返す。
> "A" == "A"
[1] TRUE
> "A" == "B"
[1] FALSE
> "ABC" == "ABC"
[1] TRUE
> "ABc" == "ABC"
[1] FALSE
> "ABC" == "ABCD"
[1] FALSE
> "ABCD" == "ABC"
[1] FALSE
ベクトルを利用した比較もできる。
> s1 <- c("A", "B", "C")
> s2 <- c("A", "B", "c")
> s1 == s2
[1] TRUE TRUE FALSE
文字列の指定した一部を取り出す
substr関数を使う。引数には抜き出す文字列の何文字目(1~)から何文字目までと指定する。
> s <- c("ABCDEFG", "あいうえお", "阿伊ab")
> substr(s, 2, 4)
[1] "BCD" "いうえ" "伊ab"
何文字目の指定にめちゃくちゃな値を与えると、取り出せる分を取り出してくれる。
> substr(s, 2, -2)
[1] "" "" ""
> substr(s, -3, 2)
[1] "AB" "あい" "阿伊"
> substr(s, 2, 10)
[1] "BCDEFG" "いうえお" "伊ab"
ベクトルの機能を活用すれば、例えば後ろから2文字だけ抜き出すといったこともできる。
> substr(s, nchar(s) - 1, nchar(s))
[1] "FG" "えお" "ab"
文字列の前後の空白を取り除く
trimws関数を使う。オプションを特に指定しなければ、文字列の前後の空白(とタブ(0x09)と復帰(CR,\r,0x0d)と改行(LF,\n,\x0a))を取り除く。第二引数に"left"と"right"をそれぞれ指定すると、前の空白だけ、後ろの空白だけを取り除く。デフォルトは両方(both)となっている。
> s <- " Hello. "
> trimws(s)
[1] "Hello."
> trimws(s, "left")
[1] "Hello. "
> trimws(s, "right")
[1] " Hello."
なお、いわゆる全角空白(0x8140)はそのままでは取り除くことができない。
> s <- " あいうえお "
> trimws(s)
[1] " あいうえお"
ヘルプによると、whitespaceオプションに取り除く文字を正規表現で指定し、その指定に従って取り除いているとのこと。デフォルトは"[ \t\r\n]"。これに全角空白分を加えた文字列を指定すると、全角空白も同時に取り除くことができる。以下は、シフトJISの環境で行った例。
> trimws(s, whitespace = "[ \t\r\n]")
[1] " あいうえお"
> trimws(s, whitespace = "[ \t\r\n ]")
[1] "あいうえお"
> trimws(s, whitespace = "[ \t\r\n\x81\x40]")
[1] "あいうえお"
文字列を特定の文字または文字列で分割する
strsplit関数を使う。分割する文字列はベクトルで与えることができる。戻り値はリスト。分割させる文字または文字列は正規表現で指定することができる。
> s <- c("A B C", " D E F ")
> strsplit(s, " ")
[[1]]
[1] "A" "B" "C"
[[2]]
[1] "" "D" "E" "" "F"
上の例では、1つの空白(0x20)で分割しようとしたが、ベクトルの2番目の要素は与えた文字列の先頭や最後に空白が含まれており、文字間の空白も1つ以上のため、分割がうまくいっていない。このような場合はあらかじめ前後の空白をtrimws関数で取り除き、正規表現のパターンを「[ ]+」(1つ以上の連続した空白(0x20))とすればよい。
> strsplit(trimws(s), "[ ]+")
[[1]]
[1] "A" "B" "C"
[[2]]
[1] "D" "E" "F"
strsplit関数の戻り値はリストであり、これをベクトルにする場合はunlist関数を使う。
> unlist(strsplit(trimws(s), "[ ]+"))
[1] "A" "B" "C" "D" "E" "F"
規則性なく空白が含まれるCSVの文字列の場合は、以下のような分割パターンを正規表現で与えれば、うまく分割することができる。
> s <- " A, B,C "
> strsplit(trimws(s), "[ ,]+")
[[1]]
[1] "A" "B" "C"
同じ文字列が繰り返された文字列を作る
そのような機能を実現する演算子や関数はRには標準で搭載されていない。paste関数とrep関数を組み合わせて使う。
> paste(rep("A", 3), collapse = "")
[1] "AAA"
> paste(rep("Abc", 4), collapse = "")
[1] "AbcAbcAbcAbc"
文字列を一文字ずつ分割する
strsplit関数を使う。第一引数に文字列を、第二引数に "" を指定すると、一文字ずつ分割する。
> s <- "ABc あいう"
> strsplit(s, "")
[[1]]
[1] "A" "B" "c" " " "あ" "い" "う"
strsplit関数の引数はベクトルを受け付けるため、戻り値は与えたベクトルごとに分けてリストで戻る。unlist関数を使うことで戻り値をベクトルに変換することができる。
> strsplit(c("ABC", "123"), "")
[[1]]
[1] "A" "B" "C"
[[2]]
[1] "1" "2" "3"
> unlist(strsplit(s, ""))
[1] "A" "B" "c" " " "あ" "い" "う"
文字列の先頭や末尾の空白もきちんと一文字ずつ分解する。
> unlist(strsplit(" あい う 12 ", ""))
[1] " " "あ" "い" " " " " "う" " " "1" "2" " " " "
バイト列を扱う
数値や文字などの情報を、8ビットずつ区切って表したものがバイト列。Rで扱うにはロウ型を使う。
> rw <- as.raw(c(1, 2, 0xa))
> print(rw)
[1] 01 02 0a
> as.integer(rw)
[1] 1 2 10
> as.integer(rw) + 20
[1] 21 22 30
文字列をロウ型に変換するにはcharToRaw関数を、ロウ型を文字列に変換するにはrawToChar関数を使う。
> rw <- charToRaw("ABC123")
> print(rw)
[1] 41 42 43 31 32 33
> as.raw(as.integer(rw) + 1)
[1] 42 43 44 32 33 34
> rawToChar(as.raw(as.integer(rw) + 1))
[1] "BCD234"
日本語も扱える。以下は、UTF-8の環境下で行った例。
> rw <- charToRaw("ABあいう12")
> print(rw)
[1] 41 42 e3 81 82 e3 81 84 e3 81 86 31 32
> print(rw[3:5])
[1] e3 81 82
> print(rawToChar(rw[3:5]))
[1] "あ"
文字列型ベクトルの要素の文字列を連結する
文字列型ベクトル同士ではなく文字列型ベクトルの要素の文字列同士を連結するには、paste関数にcollapseオプションを付けて使う。paste関数は引数に与えたベクトルをベクトルで処理しようとするため、デフォルトでは与えたベクトル同士を連結しようとするが、collapseオプションを指定すると、与えた文字列型ベクトル内の文字列を連結する。文字列の間に何も挟みたくなければ""を指定する。
> s <- c("石見舞菜香", "優木かな", "和多田美咲")
> paste(s, sep = "")
[1] "石見舞菜香" "優木かな" "和多田美咲"
> paste(s, collapse = "")
[1] "石見舞菜香優木かな和多田美咲"
> paste(s, collapse = "_")
[1] "石見舞菜香_優木かな_和多田美咲"
文字列型ベクトルの要素の文字列を連結する
文字列型ベクトル同士ではなく文字列型ベクトルの要素の文字列同士を連結するには、stringrパッケージのstr_c関数にcollapseオプションを付けて使う。str_c関数は引数に与えたベクトルをベクトルで処理しようとするため、デフォルトでは与えたベクトル同士を連結しようとするが、collapseオプションを使うと、与えた文字列型ベクトルの要素同士を連結する。文字列の間に何も挟みたくなければ""を指定する。
> library(stringr)
> s <- c("石見舞菜香", "優木かな", "和多田美咲")
> str_c(s)
[1] "石見舞菜香" "優木かな" "和多田美咲"
> str_c(s, collapse = "")
[1] "石見舞菜香優木かな和多田美咲"
> str_c(s, collapse = "_")
[1] "石見舞菜香_優木かな_和多田美咲"
strsplit関数とstr_split関数の動作の違い
strsplit関数とstringrパッケージのstr_split関数は、どちらも正規表現を使用して文字列を分割する関数だが、動作が若干異なる。以下の例のとおり、分割に指定した文字が文字列の最後に存在すると、strsplit関数はその最後の分割された文字列("")を返すことを省略するので注意。どちらも戻り値はリストである。
> s <- character(5)
> s[1] <- "//ウマ娘/アグネスデジタル/鈴木みのり"
> s[2] <- "/ウマ娘/ライスシャワー/石見舞菜香"
> s[3] <- "ウマ娘/メイショウドトウ/和多田美咲"
> s[4] <- "ウマ娘/サクラチヨノオー/野口瑠璃子/"
> s[5] <- "ウマ娘/メジロアルダン/会沢紗弥//"
> strsplit(s, "/")
[[1]]
[1] "" "" "ウマ娘" "アグネスデジタル" "鈴木みのり"
[[2]]
[1] "" "ウマ娘" "ライスシャワー" "石見舞菜香"
[[3]]
[1] "ウマ娘" "メイショウドトウ" "和多田美咲"
[[4]]
[1] "ウマ娘" "サクラチヨノオー" "野口瑠璃子"
[[5]]
[1] "ウマ娘" "メジロアルダン" "会沢紗弥" ""
> stringr::str_split(s, "/")
[[1]]
[1] "" "" "ウマ娘" "アグネスデジタル" "鈴木みのり"
[[2]]
[1] "" "ウマ娘" "ライスシャワー" "石見舞菜香"
[[3]]
[1] "ウマ娘" "メイショウドトウ" "和多田美咲"
[[4]]
[1] "ウマ娘" "サクラチヨノオー" "野口瑠璃子" ""
[[5]]
[1] "ウマ娘" "メジロアルダン" "会沢紗弥" "" ""
どちらの関数も、分割する文字列の指定に正規表現を使うことができる。
> s <- character(3)
> s[1] <- "ウオッカ/大橋彩香"
> s[2] <- "ゴールドシチー//香坂さき"
> s[3] <- "スーパークリーク///優木かな"
> str_split(s, "/+")
[[1]]
[1] "ウオッカ" "大橋彩香"
[[2]]
[1] "ゴールドシチー" "香坂さき"
[[3]]
[1] "スーパークリーク" "優木かな"
> strsplit(s, "/+")
[[1]]
[1] "ウオッカ" "大橋彩香"
[[2]]
[1] "ゴールドシチー" "香坂さき"
[[3]]
[1] "スーパークリーク" "優木かな"
str_split_1関数は機能はほぼ同じで戻り値がベクトルになる関数。ただし、要素数が1つのベクトルしか扱うことができない。
> str_split_1(s, "/+")
Error in `str_split_1()`:
! `string` must be a single string, not a character vector.
Run `rlang::last_trace()` to see where the error occurred.
> str_split_1(s[1], "/+")
[1] "ウオッカ" "大橋彩香"
文字コード
文字の文字コードを数値で得る
charToRaw関数で文字をロウ型に変換し、それをas.integer関数で数値型に変換することで得られる。得られた文字コードの数値の値は、as.raw関数でロウ型に変換し、rawToChar関数で文字型に変換することで文字に戻すことができる。以下は、文字「A」(0x41)を数値型に変換し、その値に1を足して文字の「B」(0x42)を得た例。
> r <- charToRaw("A")
> r
[1] 41
> n <- as.integer(r)
> n
[1] 65
> rawToChar(as.raw(65 + 1))
[1] "B"
文字列にもそのまま使うことができる。
> n <- as.integer(charToRaw("ABCabc"))
> n
[1] 65 66 67 97 98 99
> rawToChar(as.raw(n + 1))
[1] "BCDbcd"
日本語文字にも使える。「阿」、「伊」はそれぞれシフトJISで0x88a2、0x88c9。charToRaw関数の戻り値はロウ型であることに注意。
> Sys.getlocale()
[1] "LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;LC_MONETARY=Japanese_Japan.932;LC_NUMERIC=C;LC_TIME=Japanese_Japan.932"
> s <- c("A", "ab", "あい", "阿伊123")
> for (i in 1:length(s)) print(charToRaw(s[i]))
[1] 41
[1] 61 62
[1] 82 a0 82 a2
[1] 88 a2 88 c9 31 32 33
> for (i in 1:length(s)) print(as.integer(charToRaw(s[i])))
[1] 65
[1] 97 98
[1] 130 160 130 162
[1] 136 162 136 201 49 50 51
文字コードから文字を得る
rawToChar関数にロウ型で文字コードを与えればよい。以下はShift-JIS環境で実行した例。ASCIIコードで「A」は0x41、「1」は0x31、Shift-JISでは「朝」は0x92a9、「昼」は0x928b、「夜」は0x96e9。
> rawToChar(as.raw(c(0x41, 0x31)))
[1] "A1"
> rawToChar(as.raw(c(0x92, 0xa9, 0x92, 0x8b, 0x96, 0xe9)))
[1] "朝昼夜"
> rawToChar(as.raw(c(0x0d, 0x0a)))
[1] "\r\n"
エスケープシーケンスによる文字はそれが分かるように表示され、文字として割り当てられていない値の場合は、与えた値がそのまま返される。
> rawToChar(as.raw(c(0x0d, 0x0a)))
[1] "\r\n"
> rawToChar(as.raw(c(0xff, 0x0a)))
[1] "<ff>\n"
> rawToChar(as.raw(c(0xff, 0xfe)))
[1] "<ff><fe>"
> rawToChar(as.raw(c(0x92, 0xff)))
[1] "<92><ff>"
現在の環境の文字コードの種類を得る
localeToCharset関数を使う。引数に何も与えないと、現在の環境の、文字コードの種類を返す。
例えば、Windows版のバージョン4.1.3であれば、以下のようになるはず。
> localeToCharset()
[1] "CP932"
Windows版のバージョン4.2.2であれば、以下のようになるはず。
> localeToCharset()
[1] "UTF-8"
ロケールが返されるのではなく、文字コードの種類が返されることに注意。
文字の文字コードを調べる
charToRaw関数を使う。以下は、Windows環境下(シフトJIS)で行った例。
> r <- charToRaw("か")
> r
[1] 82 a9
> r + 1
r + 1 でエラー: 二項演算子の引数が数値ではありません
> n <- as.integer(r)
> n
[1] 130 169
> rawToChar(as.raw(c(130, 169)))
[1] "か"
文字列にも使える。
> charToRaw("あいうABC阿伊宇")
[1] 82 a0 82 a2 82 a4 41 42 43 88 a2 88 c9 89 46
> n <- as.integer(charToRaw("あいうABC阿伊宇"))
> n
[1] 130 160 130 162 130 164 65 66 67 136 162 136 201 137 70
> rawToChar(as.raw(n))
[1] "あいうABC阿伊宇"
文字列から各文字の文字コードを得る
iconv関数で指定の文字列を変換してそれをcharToRaw関数でロウ型に変換すると文字コードがバイト列で表示される。
> Sys.getlocale()
[1] "LC_COLLATE=Japanese_Japan.utf8;LC_CTYPE=Japanese_Japan.utf8;LC_MONETARY=Japanese_Japan.utf8;LC_NUMERIC=C;LC_TIME=Japanese_Japan.utf8"
> charToRaw(iconv("阿", to = "ISO-2022-JP")) # JIS
[1] 1b 24 42 30 24
> charToRaw(iconv("阿", to = "SJIS")) # シフトJIS
[1] 88 a2
> charToRaw(iconv("阿", to = "UTF-8")) # UTF-8
[1] e9 98 bf
> charToRaw(iconv("阿", to = "UTF-16")) # UTF-16(ビッグエンディアン)
[1] fe ff 96 3f
> charToRaw(iconv("阿", to = "UTF-16BE")) # UTF-16(ビッグエンディアン)
[1] 96 3f
> charToRaw(iconv("阿", to = "UTF-16LE")) # UTF-16(リトルエンディアン)
[1] 3f 96
> charToRaw(iconv("阿", to = "unicodeFFFE")) # Unicode
[1] 96 3f
iconv関数に与える文字は文字列でもかまわない。ただし、要素が1つだけ(長さが1)の文字ベクトルでなければならない。
> charToRaw(iconv("阿位鵜", to = "SJIS"))
[1] 88 a2 88 ca 89 4c
> charToRaw(iconv(c("阿位", "鵜江"), to = "SJIS"))
[1] 88 a2 88 ca
警告メッセージ:
charToRaw(iconv(c("阿位", "鵜江"), to = "SJIS")) で:
引数は長さ 1 の文字ベクトルである必要があります
最初の要素以外は全て無視されます
任意の文字コードから文字列を作成する
iconv関数、rawToChar関数、as.raw関数を組み合わせて使用する。以下は文字コードがUTF-8の環境で行った例。toオプションを省略すると自動的に現在の環境のUTF-8て出力されるため、以下の例ではtoオプションは省略可能。それぞれ順番にシフトJIS、UTF-8、UTF-16(ビッグエンディアン)、UTF-16(ビッグエンディアン)、UTF-16(リトルエンディアン)、Unicodeの文字コード(バイト列)からにそれぞれ文字列「阿位」を作成している。
> Sys.getlocale()
[1] "LC_COLLATE=Japanese_Japan.utf8;LC_CTYPE=Japanese_Japan.utf8;LC_MONETARY=Japanese_Japan.utf8;LC_NUMERIC=C;LC_TIME=Japanese_Japan.utf8"
> iconv(rawToChar(as.raw(c(0x88, 0xa2, 0x88, 0xca))), from = "SJIS", to = "UTF-8")
[1] "阿位"
> iconv(rawToChar(as.raw(c(0xe9, 0x98, 0xbf, 0xe4, 0xbd, 0x8d))), from = "UTF-8", to = "UTF-8")
[1] "阿位"
> iconv(rawToChar(as.raw(c(0x96, 0x3f, 0x4f, 0x4d))), from = "UTF-16", to = "UTF-8")
[1] "阿位"
> iconv(rawToChar(as.raw(c(0x96, 0x3f, 0x4f, 0x4d))), from = "UTF-16BE", to = "UTF-8")
[1] "阿位"
> iconv(rawToChar(as.raw(c(0x3f, 0x96, 0x4d, 0x4f))), from = "UTF-16LE", to = "UTF-8")
[1] "阿位"
> iconv(rawToChar(as.raw(c(0x96, 0x3f, 0x4f, 0x4d))), from = "unicodeFFFE", to = "UTF-8")
[1] "阿位"
文字列の文字コードを調べる
iconv関数を使う。iconv関数は第1引数に指定した文字列を、toオプションに指定した文字コードに変換する。toオプションだけを指定した場合は変換後の文字列をそのまま返すが、実行環境と文字コードが合わない場合は表示が乱れるので注意。TRUEを指定したtoRawオプションを付けると、戻り値はロウ型になりバイト列で表示されるため、このオプションを使用した利用が推奨される。
以下は、「石見舞菜香」という5つの漢字からなる文字列について、文字コードをバイト列で表示した例。なお、各漢字のそれぞれの文字コードは以下のとおり。実行した環境の文字コードはUTF-8で、JISコードとシフトJISにそれぞれ変換している。toRawオプションにTRUEを指定した場合の戻り値はロウ型かつリストであることに注意。ロウ型はバイト列で表示される。
漢字 JISコード シフトJIS UTF-8
石 0x4050 0x90ce 0xe79fb3
見 0x382b 0x8ca9 0xe8a68b
舞 0x4971 0x9591 0xe8889e
菜 0x3a5a 0x8dd8 0xe88f9c
香 0x3961 0x8d81 0xe9a699
実行例は以下のとおり。
> Sys.getlocale()
[1] "LC_COLLATE=Japanese_Japan.utf8;LC_CTYPE=Japanese_Japan.utf8;LC_MONETARY=Japanese_Japan.utf8;LC_NUMERIC=C;LC_TIME=Japanese_Japan.utf8"
> iconv("石見舞菜香", to = "ISO-2022-JP")
[1] "\033$B@P8+Iq:Z9a"
> iconv("石見舞菜香", to = "ISO-2022-JP", toRaw = TRUE)
[[1]]
[1] 1b 24 42 40 50 38 2b 49 71 3a 5a 39 61
> iconv("石見舞菜香", to = "SJIS", toRaw = TRUE)
[[1]]
[1] 90 ce 8c a9 95 91 8d d8 8d 81
> iconv("石見舞菜香", to = "UTF-8", toRaw = TRUE)
[[1]]
[1] e7 9f b3 e8 a6 8b e8 88 9e e8 8f 9c e9 a6 99
iconv関数は現在の環境の文字コードに関係なく、引数に与えた任意の文字コードからなる文字列を、任意の文字コードまたは任意の文字コードによる文字列に変換する関数。よって、以下の例のようにUTF-8環境下でシフトJISに相当するバイト列をロウ型で与えてfromオプションにシフトJISを指定することで、任意の文字コードを変換することができる。最後の例では、符号化文字集合の切り替えを示すエスケープシーケンス(0x1b 0x24 0x42)が先頭に付けられていることに注意。
> ra <- as.raw(c(0x95, 0x91, 0x8d, 0xd8, 0x8d, 0x81))
> iconv(rawToChar(ra), from = "SJIS", to = "UTF-8")
[1] "舞菜香"
> iconv(rawToChar(ra), from = "SJIS", to = "UTF-8", toRaw = TRUE)
[[1]]
[1] e8 88 9e e8 8f 9c e9 a6 99
> iconv(rawToChar(ra), from = "SJIS", to = "ISO-2022-JP", toRaw = TRUE)
[[1]]
[1] 1b 24 42 49 71 3a 5a 39 61
iconv関数の第1引数にベクトルで文字列を与えると、それぞれ変換した値を返す。
> iconv(c("石見舞菜香", "和多田美咲"), to = "SJIS", toRaw = TRUE)
[[1]]
[1] 90 ce 8c a9 95 91 8d d8 8d 81
[[2]]
[1] 98 61 91 bd 93 63 94 fc 8d e7
区点番号からJISコードを得る
以下の自作関数kutenToJisは、区点番号を与えるとそのJISコードを返す。
kutenToJis <- function(ku, ten) {
s12 <- as.hexmode(ku + 0x20)
s34 <- as.hexmode(ten + 0x20)
s <- sprintf("0x%s%s", s12, s34)
return(as.integer(s))
}
以下の2つの漢字で動作確認をする。
美 - 区点番号:4094, JISコード:0x487e(10進数 18558)
雲 - 区点番号:1732, JISコード:0x3140(10進数 12608)
動作例。
> kutenToJis <- function(ku, ten) {
+ s12 <- as.hexmode(ku + 0x20)
+ s34 <- as.hexmode(ten + 0x20)
+ s <- sprintf("0x%s%s", s12, s34)
+ return(as.integer(s))
+ }
> kutenToJis(40, 94)
[1] 18558
> jis <- kutenToJis(40, 94)
> print(jis)
[1] 18558
> print(as.hexmode(jis))
[1] "487e"
> jis <- kutenToJis(17, 32)
> print(jis)
[1] 12608
> print(as.hexmode(jis))
[1] "3140"
JISコードから区点番号を得る
以下の自作関数kutenToJisは、JISコードを与えると区点番号を返す。
jisToKuten <- function(jis) {
s <- sprintf("%04x", jis)
n1 <- as.integer(sprintf("0x%s", substr(s, 1, 2))) - 0x20
n2 <- as.integer(sprintf("0x%s", substr(s, 3, 4))) - 0x20
return(c(n1, n2))
}
以下の2つの漢字で動作確認をする。
美 - JISコード:0x487e(10進数 18558), 区点番号:4094
雲 - JISコード:0x3140(10進数 12608), 区点番号:1732
動作例。
> jisToKuten <- function(jis) {
+ s <- sprintf("%04x", jis)
+ n1 <- as.integer(sprintf("0x%s", substr(s, 1, 2))) - 0x20
+ n2 <- as.integer(sprintf("0x%s", substr(s, 3, 4))) - 0x20
+ return(c(n1, n2))
+ }
> kuten <- jisToKuten(0x487e)
> print(kuten)
[1] 40 94
> length(kuten)
[1] 2
> kuten <- jisToKuten(12608)
> print(kuten)
[1] 17 32
> length(kuten)
[1] 2
変換
文字列を数値に変換する
as.numeric関数を使う。
> s <- c("1", "2.2", "-3.3")
> as.numeric(s)
[1] 1.0 2.2 -3.3
> s <- c("A", "2.2", "- 3.3")
> as.numeric(s)
[1] NA 2.2 NA
警告メッセージ:
強制変換により NA が生成されました
数値に変換できる文字列は浮動小数点数に変換される。数値に変換できない文字列はNAになる。
整数もしくは浮動小数点数に恣意的に変換したい場合はas.integer関数もしくはas.double関数を使う。
> s <- c("0", "1", "2.2", "-3.3")
> as.integer(s)
[1] 0 1 2 -3
> as.double(s)
[1] 0.0 1.0 2.2 -3.3
数値を文字列に変換する
簡単に変換するならas.character関数、変換時に書式を指定したいのであればsprintf関数を使う。
> n <- c(1, 2, -4)
> d <- c(1.1, 0.1, -2.2)
> as.character(n)
[1] "1" "2" "-4"
> as.character(d)
[1] "1.1" "0.1" "-2.2"
> sprintf("%03d", n)
[1] "001" "002" "-04"
> sprintf("%+04d", n)
[1] "+001" "+002" "-004"
> sprintf("%8.4f", d)
[1] " 1.1000" " 0.1000" " -2.2000"
英字を大文字(小文字)に変換する
toupper関数とtolower関数は、引数に指定した文字型データに含まれる英字を、それぞれ一括で大文字、小文字に変換する。英字ではない文字は変換せずにそのまま返す。
> s <- c("A", "bc", "D E", "あ い")
> toupper(s)
[1] "A" "BC" "D E" "あ い"
> tolower(s)
[1] "a" "bc" "d e" "あ い"
文字の全角半角変換
stringiパッケージのstri_trans_general関数を使う。以下、変換例。
> library(stringi)
> s <- c("あい", "宇", "イヌ", "ネコ", "AB@", "CD{", "12", "34")
> stri_trans_general(s, "Halfwidth-Fullwidth")
[1] "あい" "宇" "イヌ" "ネコ" "AB@" "CD{" "12" "34"
> stri_trans_general(s, "Fullwidth-Halfwidth")
[1] "あい" "宇" "イヌ" "ネコ" "AB@" "CD{" "12" "34"
全角→半角変換には"Fullwidth-Halfwidth"を、半角→全角変換には"Halfwidth-Fullwidth"を指定する。英数字、カタカナ、記号など変換できるものはすべて変換するので注意。該当しない文字(ひらがな、漢字)は変換されない。
文字列の文字コードを変換する
iconv関数を使う。以下の例では、シフトSJISの環境下で、以下の3行からなるUTF-8(改行コードはCR+LF)で保存されたテキストファイル(ファイル名はutf8.txt)を直接読み込み、それをUTF-8からシフトJISに保存をしている。
ABC
あいう
阿位宇
ファイルを読み込み、文字列を変換する。
> scan("utf8.txt", what = character(), fileEncoding = "UTF-8")
Read 3 items
[1] "ABC" "あいう" "阿位宇"
> ch <- readChar("utf8.txt", 27, useBytes = TRUE)
> print(ch)
[1] "ABC\r\n縺ゅ>縺<86>\r\n髦ソ菴榊ョ<87>\r\n"
> iconv(ch, from = "UTF-8", to = "SJIS")
[1] "ABC\r\nあいう\r\n阿位宇\r\n"
iconv関数で文字列を変換するとバイト列の先頭に「FE FF」や「1B 24 42」が付く
「FE FF」はUnicodeにおけるBOM(バイトオーダーマーク)、「1B 24 42」はJISコードにおけるエスケープシーケンス。
UnicodeのUTF-16では、文字列を表現するバイト列のそのバイトの格納する順番を指定することができ、上位バイトを先に記述することをビッグエンディアン、下位バイトを先に記述する方法をリトルエンディアンという。「あ」(JIS:0x2422、UTF-16:0x3042)と「亜」(JIS:0x3021、UTF-16:0x4E9c)の二文字を使って試してみる。
以下は、シフトJIS(CP932)の環境で、文字列「あ亜」をUTF-16に変換した例。
> charToRaw(iconv("あ亜", from = "CP932", to = "UTF-16"))
[1] fe ff 30 42 4e 9c
> charToRaw(iconv("あ亜", from = "CP932", to = "UTF-16BE"))
[1] 30 42 4e 9c
> charToRaw(iconv("あ亜", from = "CP932", to = "UTF-16LE"))
[1] 42 30 9c 4e
1番目の例ではエンディアンを指定しないため、「FE FF」(関数の戻り値は小文字で「fe ff」)が付けられてビッグエンディアンであることが明示されている。2番目はビッグエンディアンを指定、3番目はリトルエンディアンを指定した例。
同様にJISコード(ISO-2022-JP)に変換してみる。
> charToRaw(iconv("あ亜", from = "CP932", to = "ISO-2022-JP"))
[1] 1b 24 42 24 22 30 21
「あ亜」のバイト列(24 22 30 21)の前に「1B 24 42」(関数の戻り値は小文字で「1b 24 42」)が付けられている。これは以降のバイト列がJISコードによる文字列であることを明示するためのバイト列。UTF-16と異なり、iconv関数でJISコードへの変換時にエスケープシーケンスを付けないようにすることはできない。
その他
エスケープシーケンスによる文字を表示する
\n(改行)や\r(復帰)などが含まれている文字列は、ただ表示させると、その拡張表記のままに表示されてしまう。
> s1 <- "Hi."
> s2 <- "Hello.\n"
> s3 <- "Hi.\rHello."
> cat(s1)
Hi.> cat(s2)
Hello.
> cat(s3)
Hi.
Hello.>
print関数を使うと、拡張表記による文字は、その拡張表記そのままに¥記号を使って表示する。
> print(s1)
[1] "Hi."
> print(s2)
[1] "Hello.\n"
> print(s3)
[1] "Hi.\rHello."
指定された数の空白(0x20)からなる文字列を得る
C#でいうところのStrings.Spaceメソッド。そのような機能を持つ関数はRには標準で搭載されていないためその機能を持つ関数を自作する。以下の3行がその自作関数。
space <- function(n) {
return(paste(rep(" ", n), collapse = ""))
}
試しに使ってみる
> space(5)
[1] " "
> paste("A", space(1), "B", space(2), "C", sep = "")
[1] "A B C"
文字列を特定の文字または文字列で分割する
stringrパッケージのstr_split関数を使う。分割する文字列はベクトルで与えることができる。戻り値はリスト。分割させる文字または文字列は正規表現で指定することができる。
> library(stringr)
> s <- c("A B C", " D E F ")
> str_split(s, " ")
[[1]]
[1] "A" "B" "C"
[[2]]
[1] "" "D" "E" "" "F" ""
上の例では、1つの空白(0x20)で分割しようとしたが、ベクトルの2番目の要素は与えた文字列の先頭や最後に空白が含まれており、文字間の空白も1つ以上のため、分割がうまくいっていない。このような場合はあらかじめ前後の空白をtrimws関数で取り除き、正規表現のパターンを「[ ]+」(1つ以上の連続した空白(0x20))とすればよい。
> str_split(trimws(s), "[ ]+")
[[1]]
[1] "A" "B" "C"
[[2]]
[1] "D" "E" "F"
strsplit関数の戻り値はリストであり、これをベクトルにする場合はunlist関数を使う。
> unlist(str_split(trimws(s), "[ ]+"))
[1] "A" "B" "C" "D" "E" "F"
規則性なく空白が含まれるCSVの文字列の場合は、以下のような分割パターンを正規表現で与えれば、うまく分割することができる。
> unlist(str_split(trimws(s), "[ ,]+"))
[1] "A" "B" "C"
CIDから文字を得る
ここからファイルaj17-kanji.txtをダウンロードしてカレントディレクトリに置き、以下のコマンドを実行する。
> library(tidyverse)
> tbl <- read_delim("aj17-kanji.txt", delim = "\t", comment = "#", col_names = FALSE, progress = FALSE, show_col_types = FALSE)
> cid0 <- tbl[[1]]
> ucd0 <- tbl[[19]]
> idx <- which(nchar(ucd0) == 6)
> cid <- cid0[idx]
> ucd <- ucd0[idx]
> h1 <- as.integer(as.hexmode(substr(ucd, 3, 4)))
> h2 <- as.integer(as.hexmode(substr(ucd, 5, 6)))
> mx <- matrix(c(h1, h2), ncol = 2)
上記は処理を簡単にするため、Unicodeが16進数表記で「U+」を除く4桁の文字のみ取り出している。CIDを指定して、文字を取り出してみる。最後の例のとおり、文字が割り当てられていないCIDを指定すると、文字列の空欄が返る。
> idx <- which(cid == 2000) # CIDの2000が示す文字は「江」
> print(iconv(rawToChar(as.raw(mx[idx, ])), from = "unicodeFFFE"))
[1] "江"
> idx <- which(cid == 4000) # CIDの4000が示す文字は「輪」
> print(iconv(rawToChar(as.raw(mx[idx, ])), from = "unicodeFFFE"))
[1] "輪"
> idx <- which(cid == 99999) # CIDの99999が示す文字は存在しない
> print(iconv(rawToChar(as.raw(mx[idx, ])), from = "unicodeFFFE"))
[1] ""
文字からCIDを得る
ここからファイルaj17-kanji.txtをダウンロードしてカレントディレクトリに置き、以下のコマンドを実行する。
> library(tidyverse)
> tbl <- read_delim("aj17-kanji.txt", delim = "\t", comment = "#", col_names = FALSE, progress = FALSE, show_col_types = FALSE)
> cid0 <- tbl[[1]]
> ucd0 <- tbl[[19]]
> idx <- which(nchar(ucd0) == 6)
> cid <- cid0[idx]
> ucd <- ucd0[idx]
> h1 <- as.integer(as.hexmode(substr(ucd, 3, 4)))
> h2 <- as.integer(as.hexmode(substr(ucd, 5, 6)))
> mx <- matrix(c(h1, h2), ncol = 2)
> s <- character(nrow(mx))
> for (i in 1:nrow(mx)) {
+ s[i] <- iconv(rawToChar(as.raw(mx[i, ])), from = "unicodeFFFE")
+ }
上記は処理を簡単にするため、Unicodeが16進数表記で「U+」を除く4桁の文字のみ取り出している。文字を指定して、CIDを取り出してみる。最後の例のとおり、該当する文字がない場合は数値のNULLが返る。
> idx <- which(s == "江") # CIDの2000が示す文字は「江」
> print(cid[idx])
[1] 2000
> idx <- which(s == "輪") # CIDの4000が示す文字は「輪」
> print(cid[idx])
[1] 4000
> idx <- which(s == "𩸽") # サロゲートペアの文字は本整理では対象外
> print(cid[idx])
numeric(0)
連番による連続した文字列を作成する
数値型ベクトルで連番を作成し、それをsprintf関数で加工して文字列に変換すればよい。連番は、1,2,3,…と001,002,003,…のような2種類があるが、sprintf関数で指定する書式文字列をうまく利用すれば、どちらも簡単に作ることができる。cat関数を使えば、ファイルに簡単に出力できる。
> n <- 1:3
> sprintf("%d", n)
[1] "1" "2" "3"
> sprintf("%04d", n)
[1] "0001" "0002" "0003"
> s <- sprintf("file%04d.jpg", n)
> print(s)
[1] "file0001.jpg" "file0002.jpg" "file0003.jpg"
> cat(s, file = "temp.csv", sep = "\n")
temp.csvの中身
file0001.jpg
file0002.jpg
file0003.jpg
絶対パスを表す文字列からファイル名(ディレクトリ名)だけを取り出す
gsub関数を使う。以下はWindows環境下における絶対パス(区切り記号は「¥」)から、ファイル名とそれ以外のディレクトリ名をそれぞれ取り出した例。
> s <- c("C:\\マクロス\\Δ\\カナメ.バッカニア.txt")
> gsub("^.+\\\\", "", s)
[1] "カナメ.バッカニア.txt"
> gsub("\\\\[^\\]+$", "", s)
[1] "C:\\マクロス\\Δ"
ランダムに作成された文字列を得る
sample関数とpaste関数を組み合わせて使う。sample関数の第2引数に、得たい文字列の長さを指定する。
定数LETTERSとlettersにはそれぞれ英大文字と英小文字を含むベクトルのため、これらをそのまま利用すれば英大小文字だけからなるランダムな文字列を作成することができる。当然、記号を適当に含めれば、それらの文字列からなる任意の文字列を作成することができる。
> LETTERS
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
> letters
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
> s <- LETTERS
> paste(sample(s, 14, replace = TRUE), collapse = "")
[1] "UJTMRBBANJHZHR"
> paste(sample(s, 14, replace = TRUE), collapse = "")
[1] "PWYFPVJQHJGSNI"
> s <- c(LETTERS, letters)
> paste(sample(s, 14, replace = TRUE), collapse = "")
[1] "QjrFTEySFGwOEG"
> paste(sample(s, 14, replace = TRUE), collapse = "")
[1] "SNRBuCpZdkqpIs"
> s <- c(LETTERS, letters, "#", "$", "%", "&")
> paste(sample(s, 24, replace = TRUE), collapse = "")
[1] "bEimcMQlAHCdRkc%m#GbfifS"
> paste(sample(s, 24, replace = TRUE), collapse = "")
[1] "CVrUHSYWWRPwcrsXF&StkSrK"
ランダムに作成された文字列を得る
stringiパッケージのstri_rand_strings関数を使う。一度に複数個をベクトルで得ることができる。
> library(stringi)
> stri_rand_strings(1, 14)
[1] "cJBFBNlLVvbqLQ"
> s <- stri_rand_strings(3, 14)
> library(stringi)
> stri_rand_strings(1, 14)
[1] "NJNxejqJl3dgYS"
> s <- stri_rand_strings(3, 10)
> print(s)
[1] "5Y4del2QiL" "9JK3rYewTL" "4IXEI2ADaN"
ヘルプには、文字列の作成に使用される文字についての説明がある。
> ?stri_rand_strings
Usage
stri_rand_strings(n, length, pattern = "[A-Za-z0-9]")
正規表現の書式を模した書式により、使用される文字列の指定ができる。デフォルトでは英大文字、英小文字、英数字だけだが、例えば、#、$、%、&の記号を4つ追加する場合は、以下のように指定をすればよい。$と&は書式を示す文字のため、前に¥を付けなければならないが、¥はエスケープシーケンスを表す記号でもあるため、前に「¥¥」と2つ続けて入力している。
> stri_rand_strings(3, 14, pattern = "[a-z#\\$%\\&]")
[1] "yapn%u$iaguxyj" "#fnkunslor&blp" "v&nro&mvxvpjke"
文字列はRの乱数の規則に則って作成される。そのため、乱数の種をset.seed関数で指定すると、作成される文字列を再現することができる。
> stri_rand_strings(4, 6)
[1] "O45lLP" "L0uBiZ" "XMpBOU" "UNdLx2"
> set.seed(6)
> stri_rand_strings(4, 6)
[1] "bwGNoy" "xlV3du" "5IlFWg" "9hxp7E"
> stri_rand_strings(4, 6)
[1] "kJMuHQ" "W7xl8v" "N3zlhi" "4wyp7Q"
> set.seed(6)
> stri_rand_strings(4, 6)
[1] "bwGNoy" "xlV3du" "5IlFWg" "9hxp7E"
> stri_rand_strings(4, 6)
[1] "kJMuHQ" "W7xl8v" "N3zlhi" "4wyp7Q"
ランダムに作成された文字列を得る
runif関数とpaste関数を組み合わせて使う。chベクトルには文字列にランダムで割り振る文字を指定し、lenベクトルには得たい文字列の長さを1つだけ指定する。ただし、この方法では一度に一つの文字列しか得ることはできない。
定数LETTERSとlettersにはそれぞれ英大文字と英小文字を含むベクトルのため、これらをそのまま利用すれば英大小文字だけからなるランダムな文字列を作成することができる。当然、記号を適当に含めれば、それらの文字列からなる任意の文字列を作成することができる。
> len <- 10
> ch <- LETTERS
> paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "")
[1] "WTHNZZCBIJ"
> paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "")
[1] "STATFLICHV"
> len <- 20
> ch <- c(LETTERS, letters, "#", "$", "%", "&")
> paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "")
[1] "bBYEODy&DlSZuKcaaykO"
> paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "")
[1] "hCYaqYkpWkDbP$HcAZPB"
文字列はRの乱数の規則に則って作成される。そのため、乱数の種をset.seed関数で指定すると、作成される文字列を再現することができる。
> paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "")
[1] "XG#C#CwhHgBWKgyVdblP"
> set.seed(20)
> paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "")
[1] "xrPd$%FDSUoqApKZSGQt"
> paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "")
[1] "bBYEODy&DlSZuKcaaykO"
> set.seed(20)
> paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "")
[1] "xrPd$%FDSUoqApKZSGQt"
> paste(ch[floor(runif(len, 1, length(ch) + 1))], collapse = "")
[1] "bBYEODy&DlSZuKcaaykO"
文字列のハッシュ値を得る
opensslパッケージを使う。以下はハッシュ関数MD5、SHA-1、SHA-256でそれぞれハッシュ値を得た例。
> s <- c("セナディア", "鈴木みのり", "イレイナ", "本渡楓")
> openssl::md5(s)
[1] "b17b3d97c7f19375d1989eaa6d5d7f19"
[2] "2cdcdf384125ac19c173e9517b23847b"
[3] "df7909633e9e58c8fc61f7ddaa996264"
[4] "9adf030a3e1852802deadb793c4eab0f"
> openssl::sha1(s)
[1] "226dda8c2f33794cdefaef027a43e48135abb6c3"
[2] "728d6a009b1700f9759ed2b502a0f673820700d5"
[3] "97fceb672478954169751379650c14b12f76d808"
[4] "be0a600d132eccfb2ed41a0424189efe210e8dff"
> openssl::sha256(s)
[1] "e385677aa0a829d448251e47f3f6cfa4b82951c9df9b53658a29e71cbfb3125d"
[2] "4a806bf1e967f0764841aabcb3e634316f4b19be1dc9244480cd2c26c315db2b"
[3] "4bd95d8e4a10c946842b256f0b7f281d5db587161a8a5658ae3ab5c19543a222"
[4] "443e41893a26ea324275a26f89a48812f7ac0b687bebf0baddadcd0996116405"
digestパッケージのdigest関数でも得ることができるが、こちらは文字列を文字列型ベクトルで与えることができないため、最初の要素しか使用されない。
> digest::digest(s, algo = "md5", serialize = FALSE)
[1] "b17b3d97c7f19375d1989eaa6d5d7f19"
> digest::digest(s, algo = "sha1", serialize = FALSE)
[1] "226dda8c2f33794cdefaef027a43e48135abb6c3"
> digest::digest(s, algo = "sha256", serialize = FALSE)
[1] "e385677aa0a829d448251e47f3f6cfa4b82951c9df9b53658a29e71cbfb3125d"
> digest::digest("セナディア", algo = "sha256", serialize = FALSE)
[1] "e385677aa0a829d448251e47f3f6cfa4b82951c9df9b53658a29e71cbfb3125d"
ドイツ語のウムラウトを表示する
ドイツ語のウムラウト3文字とそのUTF-8による文字コード(16進数による表記)は以下のとおり。
ä c3a4
ö c3b6
ü c3bc
文字コードを使用してrawToChar関数とas.raw関数を組み合わせてウムラウトの文字列を作成し、それを使用すればよい。
> Sys.getlocale()
[1] "LC_COLLATE=Japanese_Japan.utf8;LC_CTYPE=Japanese_Japan.utf8;LC_MONETARY=Japanese_Japan.utf8;LC_NUMERIC=C;LC_TIME=Japanese_Japan.utf8"
> rawToChar(as.raw(c(0xc3, 0xa4)))
[1] "ä"
> rawToChar(as.raw(c(0xc3, 0xb6)))
[1] "ö"
> rawToChar(as.raw(c(0xc3, 0xbc)))
[1] "ü"
> s <- rawToChar(as.raw(c(0xc3, 0xa4)))
> cat(sprintf("%s の代用表記は ae です。\n", s))
ä の代用表記は ae です。
ドイツ語のエスツェットを表示する
ドイツ語のウムラウト3文字とそのUTF-8による文字コード(16進数による表記)は以下のとおり。
ß c39f
文字コードを使用してrawToChar関数とas.raw関数を組み合わせてエスツェットの文字列を作成し、それを使用すればよい。
> Sys.getlocale()
[1] "LC_COLLATE=Japanese_Japan.utf8;LC_CTYPE=Japanese_Japan.utf8;LC_MONETARY=Japanese_Japan.utf8;LC_NUMERIC=C;LC_TIME=Japanese_Japan.utf8"
> rawToChar(as.raw(c(0xc3, 0x9f)))
[1] "ß"
> s <- rawToChar(as.raw(c(0xc3, 0x9f)))
> cat(sprintf("%s の代用表記は ss です。\n", s))
ß の代用表記は ss です。