R(文字と文字列)

2022年12月 2日 (金)

[R]現在の環境の文字コードの種類を得る

localeToCharset関数を使う。引数に何も与えないと、現在の環境の、文字コードの種類を返す。

例えば、Windows版のバージョン4.1.3であれば、以下のようになるはず。

> localeToCharset()
[1] "CP932"

Windows版のバージョン4.2.2であれば、以下のようになるはず。

> localeToCharset()
[1] "UTF-8"

ロケールが返されるのではなく、文字コードの種類が返されることに注意。

2022年11月 9日 (水)

[R]同じ文字列が繰り返された文字列を作る。

そのような機能を実現する演算子や関数はRには標準で搭載されていない。paste関数とrep関数を組み合わせて使う。

> paste(rep("A", 3), collapse = "")
[1] "AAA"
> paste(rep("Abc", 4), collapse = "")
[1] "AbcAbcAbcAbc"

2022年10月26日 (水)

[R]文字の任意の文字コードを簡単に調べる

charToRaw関数は引数に与えた文字列をロウ型で返すため、これを利用すると、そのRを実行している環境での文字コードを簡単に調べることができる。以下は、文字列「あい亜井」のそれぞれの文字の文字コードを調べた例。なお、これら文字の文字コード(左から、文字、その文字のシフトJISコード、その文字のutf-8コード)は以下のとおり(0xは16進数であることを示す接頭語)。

あ 0x82A0 0xE38182
い 0x82A2 0xE38184
亜 0x889F 0xE4BA9C
井 0x88E4 0xE4BA95

WindowsのR(文字コードはシフトJIS)で実行すると、以下のようにシフトJISコードがバイト列で返される。

> charToRaw("あい亜井")
[1] 82 a0 82 a2 88 9f 88 e4

任意の文字の任意の文字コードを調べるには、iconv関数を使う。戻り値はデフォルトでは文字列のため、文字コードの値を知りたいのであれば、toRawオプションをTRUEにすることでロウ型で返すため、これをTRUEにする。WindowsのR(文字コードはシフトJIS)で実行すると、以下のようになる。

> iconv("あい亜井", to = "sjis", toRaw = TRUE)
[[1]]
[1] 82 a0 82 a2 88 9f 88 e4
> iconv("あい亜井", to = "utf-8", toRaw = TRUE)
[[1]]
[1] e3 81 82 e3 81 84 e4 ba 9c e4 ba 95

2022年10月25日 (火)

[R]文字の文字コードを調べる

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阿伊宇"

2022年10月22日 (土)

[R]文字列に特定の文字列が含まれているか調べる

grep関数を使う。正規表現も使える。第一引数にパターンを指定する。

> s <- c("あいう", "いうあ", "うあい")
> grep("^あ", s, value = TRUE)
[1] "あいう"
> grep("あ$", s, value = TRUE)
[1] "いうあ"
> grep("[あ]", s, value = TRUE)
[1] "あいう" "いうあ" "うあい"

[R]エスケープシーケンスによる文字を表示する

\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."

2022年10月21日 (金)

[R]文字コードから文字を得る

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] "\n"
> rawToChar(as.raw(c(0xff, 0xfe)))
[1] ""
> rawToChar(as.raw(c(0x92, 0xff)))
[1] "<92>"

2022年10月15日 (土)

[R]バイト列を扱う

数値や文字などの情報を、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] "あ"

2022年9月30日 (金)

[Python]文字列を連結する

+演算子を使う。

>>> s = 'a' + 'bc' + 'def'
>>> print(s)
abcdef

2022年8月18日 (木)

[R]文字の全角半角変換

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"を指定する。英数字、カタカナ、記号など変換できるものはすべて変換するので注意。該当しない文字(ひらがな、漢字)は変換されない。

より以前の記事一覧

無料ブログはココログ