🖥

#Ruby – UTF8 SJIS でのファイル書き込み、読み込みの挙動を試す

2020/01/26に公開

# -----------------------------------------------------------
# String のエンコード
# -----------------------------------------------------------

# 日本語を文字列としてエンコードした結果
'あ'.encode(Encoding::SJIS)
# => "\x{82A0}"

# String的にUTf_8にエンコードし直すと、UTf_8に戻る
"あ".encode(Encoding::SJIS).encode(Encoding::UTF_8)
# => "あ"

# -----------------------------------------------------------
# A. UTF8の文字列を UTF_8指定で ファイルに書き込む
# -----------------------------------------------------------
File.write('tmp/utf8.txt', 'あ', encoding: Encoding::UTF_8)
# => 3

# 当たり前だがUTF_8で読める
File.read('tmp/utf8.txt', encoding: Encoding::UTF_8)
# => "あ"

# SJIS では読めない
File.read('tmp/utf8.txt', encoding: Encoding::SJIS)
# Encoding::InvalidByteSequenceError: incomplete "\x82" on Windows-31J

# -----------------------------------------------------------
# B. SJIS にエンコードした文字列を UTF_8指定で ファイルに書き込む
# -----------------------------------------------------------
File.write('tmp/sjis_string.txt', 'あ'.encode(Encoding::SJIS), encoding: Encoding::UTF_8)
# => 3

# なぜかUTF_8で読める
File.read('tmp/sjis_string.txt', encoding: Encoding::UTF_8)
# => "あ"

# SJIS では読めない
File.read('tmp/sjis_string.txt', encoding: Encoding::SJIS)
# Encoding::InvalidByteSequenceError: incomplete "\x82" on Windows-31J

# 文字列のStringでんエンコードは無視されて、Aパターンと全く同じ挙動になっているような気がした
# File.write がエンコード関係をすべてうまくハンドリングしてくれているのかもしれない

# -----------------------------------------------------------
# UTF_8の文字列を SJIS指定でファイルに書き込む
# -----------------------------------------------------------
File.write('tmp/sjis_encoding.txt', 'あ', encoding: Encoding::SJIS)
# => 2

# UTF8で読むとこのような文字列が返る
File.read('tmp/sjis_encoding.txt', encoding: Encoding::UTF_8)
# => "\x82\xA0"

# 文字列自体をUTF_8エンコードしても何も変わらない
# 何か自分がエンコードやデコードの関係を根本的に理解していない気はする
File.read('tmp/sjis_encoding.txt', encoding: Encoding::UTF_8).encode(Encoding::UTF_8)
# => "\x82\xA0"

# SJIS指定をしてファイルを読んだ時にUTF_8の文字列が返る
File.read('tmp/sjis_encoding.txt', encoding: Encoding::SJIS)
# => "あ"



Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2962

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2020-01-26

Discussion