« [R]10年ごとに最も多くホームランを放ったプレイヤー(「Rによるセイバーメトリクス入門」(技術評論社)pp.59-61) | トップページ | [R]5,000打数以上経験した全プレイヤーの三振率とホームラン率(「Rによるセイバーメトリクス入門」(技術評論社)pp.61-63) »

2023年3月27日 (月)

[R]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コードへの変換時にエスケープシーケンスを付けないようにすることはできない。

« [R]10年ごとに最も多くホームランを放ったプレイヤー(「Rによるセイバーメトリクス入門」(技術評論社)pp.59-61) | トップページ | [R]5,000打数以上経験した全プレイヤーの三振率とホームラン率(「Rによるセイバーメトリクス入門」(技術評論社)pp.61-63) »

R(文字と文字列)」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

« [R]10年ごとに最も多くホームランを放ったプレイヤー(「Rによるセイバーメトリクス入門」(技術評論社)pp.59-61) | トップページ | [R]5,000打数以上経験した全プレイヤーの三振率とホームラン率(「Rによるセイバーメトリクス入門」(技術評論社)pp.61-63) »

無料ブログはココログ

■■

■■■