Skip to content

Commit

Permalink
appendix原稿(簡単なメモ)
Browse files Browse the repository at this point in the history
  • Loading branch information
uribo committed May 2, 2022
1 parent 25514c2 commit 74ebb18
Show file tree
Hide file tree
Showing 14 changed files with 2,608 additions and 1 deletion.
6 changes: 6 additions & 0 deletions _quarto.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ book:
- ch6.qmd
- ch7.qmd
- references.qmd
appendices:
- magrittr.qmd
- character-encoding.qmd
- regular-expression.qmd
- datetime-format.qmd
- locale.qmd
site-url: https://uribo.github.io/dmr/
repo-url: https://github.com/uribo/dmr
repo-branch: main
Expand Down
55 changes: 55 additions & 0 deletions character-encoding.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
### 文字コードとエンコーディング

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

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

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

```{r}
(x <- "\U00C4")
Encoding(x)
(x <- "\U00E9")
Encoding(x)
```

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

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

#### エンコードの変換

Rで利用可能な文字コードは`iconvlist()`関数を用いて出力することができる。ここで出力される文字集合は、ファイル読み込みの際にエンコードを指定するものと共通のものである\footenote{read.table()関数でエンコードを指定する引数にfileEncodingがある。3章「表形式のテキストファイル」を参照}。これらの文字集合から、関数`iconv()`によって指定の文字集合に対応したエンコードを実行できる。

```{r}
# 文字集合規格の一部と数を出力
x <- iconvlist()
x[392:401]
length(x)
# 引数fromとtoそれぞれに変換前後の文字コードを指定する
iconv("\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8", from = "CP932", to = "UTF-8")
```

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

```{r}
# 日本語に関係した主な文字コードのうちRで利用可能なものを検出する
encode.jp <- c("EUC-JP", "ISO-2022-JP", "SJIS", "SHIFT_JIS", "CP932", "UTF8")
is.element(encode.jp, iconvlist())
```
41 changes: 41 additions & 0 deletions datetime-format.qmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#### コラム: 日付・時間の書式

文字列を任意の書式で出力する`format()``strftime()`などの関数には共通した書式が適用される(表XX)。同様に`strptime()`では引数に与えた日付・時間を表現する書式を指定することで、日付・時間のオブジェクトを生成する。

<!-- 大文字と小文字の区別 -->

<!-- 表番号 2015年12月25日 14時1分30秒 を例にした -->

| 表記 | 表現 | 表記の例 |
|------|--------------|----------------|
| %a | 曜日名の略称 | Fri |
| %A | 完全な曜日名 | Friday |
| %b | 月名の略称 | Dec |
| %B | 完全な月名 | December |
| %c | 日付と時間 ("%a %b %e %H:%M:%S %Y") | Fri Dec 25 14:00:00 2015 |
| %y | 西暦の下2桁 | 15 |
| %Y | 西暦 | 2015 |
| %m || 12 |
| %d | 日(1月の範囲) | 25 |
| %j | 日(1年の範囲) | 359 |
| %H | 時間(24時間) | 14 |
| %I | 時間(12時間) | 02 |
| %M || 01 |
| %p | 午前と午後の区分 | PM |
| %S || 30 |
| %w | 曜日\footnote{日曜日を0とする} | 5 |
| %x | 年月日 ("%m/%d/%y") | 12/25/2015 |
| %X | 時刻 ("%H:%M:%S") | 14:01:30 |

```{r}
# 書式を指定して日付・時間クラスオブジェクトの表現を変更する
# これらはすべて文字列クラスオブジェクトに変換される点に注意する
Sys.Date()
format(Sys.Date(), "%Y年%m月%d日")
format(Sys.time(), "%x %X")
```

```{r}
# 文字列から書式を指定した日付・時間オブジェクトを作成
strptime("2017年2月25日 14:01:30", format = "%Y年%m月%d日 %X")
```
Loading

0 comments on commit 74ebb18

Please sign in to comment.