2016/10/23(日) [n年前の日記]
#2 [ruby] Ruby でUTF-16LEのテキストファイルにアクセス
せっかくテストしたのでメモ。動作確認環境は、Windows10 x64 + Ruby 2.2.5 p319。
テストに使った UTF-16LE のテキストは以下。
_text_utf16le_bom.txt
テストに使った UTF-16LE のテキストは以下。
_text_utf16le_bom.txt
◎ 読み込み。 :
まずは読み込んでみる。
_open_utf16le.rb
結果。
_open_utf16le.rb
# UTF-16LE + BOM のテキストファイルにアクセス infile = "text_utf16le_bom.txt" File.open(infile, 'rb:BOM|UTF-16LE') {|f| while l = f.gets l.chomp! puts l.encoding # => UTF-16LE end }
- File.open() に 'rb:BOM|UTF-16LE' を指定すれば UTF-16LE + BOM として開ける。
- さらに、gets で読み込めば、 string が UTF-16LE として扱われる。
- フツーは、ファイルを開いたら close で閉じないといけないが、File.open() にブロック({ } とか do end とか)をつけた場合は close を省略できる。
結果。
> open_utf16le.rb UTF-16LE UTF-16LE UTF-16LE UTF-16LE UTF-16LE UTF-16LE UTF-16LE UTF-16LE「文字列(String)のタイプは UTF-16LEだよ」と表示された。
◎ 正規表現。 :
UTF-16LE + BOM の文字列に対して正規表現を使う例。
_open_utf16le_regexp.rb
結果。
_open_utf16le_regexp.rb
# UTF-16LE + BOM の文字列に対して正規表現を使う infile = "text_utf16le_bom.txt" re0 = Regexp.new( '^\/\/'.to_s.encode("UTF-16LE") ) re1 = Regexp.new( '^(.+)\t(.+)$'.to_s.encode("UTF-16LE") ) f = File.open(infile, 'rb:BOM|UTF-16LE') while l = f.gets if l =~ re0 puts "comment" elsif l =~ re1 puts "data" end end f.closeソースコードの文字コード(この場合はUTF-8)、とは異なっている文字コードの文字列(UTF-16LE)に対して正規表現を使いたい場合、Regexp.new() を使う。いつもの調子で l =~ /^(.+)/ とか書いてしまうと UTF-16LE と UTF-8 が混在してるので「おいコラ、違う文字コードが混ざってるぞ」と怒られる
結果。
> open_utf16le_regexp.rb comment comment data data comment comment data dataUTF-16LEの文字列に対して正規表現を使って判別処理ができてる。
◎ 書き込み。 :
UTF-16LE + BOM でテキストファイルを出力してみる。
_output_utf16le.rb
_output_utf16le.rb
# UTF-16LE + BOM の文字列をテキストファイルとして出力 outfile = "_tmp.txt" File.open(outfile, 'wb:UTF-16LE') { |f| f.write "\uFEFF" # BOMを出力 DATA.each do |l| f.puts l.encode("UTF-16LE") end } __END__ ABCDEFG 0123456 日本語を記述
- f = open(outfile, 'wb:UTF-16LE') で、UTF-16LE で出力できる。
- f.write "\uFEFF" で、BOMを出力。
- DATA.each {|l| puts l } を使えば、__END__ 以降に書かれた文字列を1行ずつ読み込める。
◎ 参考ページ。 :
_ruby - Replacing string in UTF-16LE encoded file - Stack Overflow
_Excelですぐ開けるUnicodeなCSVをRubyで生成する | 秋山ブログ
_Rubyのエンコーディングその2 - @tmtms のメモ
_異なるエンコーディングでのファイル書き出しと読み込み - Qiita
_Rubyist Magazine - Ruby M17N の設計と実装
_constant Object::DATA (Ruby 2.3.0)
_RubyのDATAという特殊なグローバル定数 - yarbの日記
_たまに便利な、Rubyの組み込み定数 - Qiita
_Excelですぐ開けるUnicodeなCSVをRubyで生成する | 秋山ブログ
_Rubyのエンコーディングその2 - @tmtms のメモ
_異なるエンコーディングでのファイル書き出しと読み込み - Qiita
_Rubyist Magazine - Ruby M17N の設計と実装
_constant Object::DATA (Ruby 2.3.0)
_RubyのDATAという特殊なグローバル定数 - yarbの日記
_たまに便利な、Rubyの組み込み定数 - Qiita
[ ツッコむ ]
以上です。