Ruby には重要なエンコーディング設定として以下の3つが存在します 1) スクリプトエンコーディング 2) デフォルト外部エンコーディング 3) デフォルト内部エンコーディング 但し内部エンコーディングに関しては、デフォルトは nil であって、意味は『何もしない』という考え方が一番問題無く理解できると思います。 しかし、Ruby の デフォルト外部エンコーディングは、実際の外部記憶装置にあるデータのエンコーディングとして扱われるので、指定する事によって日本語文字列の問題を解決できます。( インストール時に外部エンコーディングを UTF-8 に設定してテストしています )
そして、通常はソースコードも UTF-8 で書かれると思いますが、マジックコメントによって他のエンコーディングでの記述が可能です。 WEB アプリ用テストコード
# -*- coding: utf-8 -*- puts "Content-Type: text/plain; charset=utf-8" puts "Expires: Thu, 19 Nov 1981 08:52:00 GMT" puts "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" puts "Pragma: no-cache" puts # ********************* # エンコーディング の設定 # ********************* #Encoding.default_external='utf-8' #Encoding.default_external='cp932' #Encoding.default_internal='utf-8' # ********************* # 外部,内部 # ********************* #STDIN.set_encoding('cp932', 'utf-8') #STDOUT.set_encoding('cp932', 'utf-8') # ********************* # 出力の整理 # ********************* def sep puts puts "---------------------" end # ********************* # ソースエンコーディング # ********************* puts "Script Encoding" p __ENCODING__ # スクリプトエンコーディング(1行目/マジックコメントで決定) sep # ********************* # エンコーディング # ********************* puts "Default Encoding" print "external : " p Encoding.default_external print "internal : " p Encoding.default_internal sep # ********************* # STDIN エンコーディング # ********************* puts "STDIN Encoding" print "external : " p STDIN.external_encoding print "internal : " p STDIN.internal_encoding sep # ********************* # STDOUT エンコーディング # ********************* puts "STDOUT Encoding" print "external : " p STDOUT.external_encoding print "internal : " p STDOUT.internal_encoding sep # ********************* # 実際のエンコーディング # enc => Encoding # ********************* Encoding.list.each do |enc| print enc, ',' end puts sep # ********************* # 別名を含む # enc => String # ********************* Encoding.name_list.each do |enc| print enc, ',' end puts sep # ********************* # テキスト入力 # ********************* file = File.open('日本語.txt').each_line do |line| print line end file.close sep
コマンドプロンプト用テストコードこの文字化けは、標準入力の文字列が SHIFT_JIS であるのに対して、UTF-8 が設定されているので化けています。以下の設定を追加すると正しく表示されます。
STDIN.set_encoding('cp932', 'utf-8')ただ、テキストファイル内の文字列は、WEB アプリのテストコードでは明らかに UTF-8 にもかかわらず、標準出力には正しく表示されています。これは、Windows の ロケール等で判断されて自分的に変換されていると推測します( わりと良くある事なので )。
# -*- coding: utf-8 -*- # ********************* # エンコーディング の設定 # ********************* #Encoding.default_external='utf-8' #Encoding.default_external='cp932' #Encoding.default_internal='utf-8' # ********************* # 外部,内部 # ********************* #STDIN.set_encoding('cp932', 'utf-8') #STDOUT.set_encoding('cp932', 'utf-8') # ********************* # 出力の整理 # ********************* def sep puts puts "---------------------" end # ********************* # ソースエンコーディング # ********************* puts "Script Encoding" p __ENCODING__ # スクリプトエンコーディング(1行目/マジックコメントで決定) sep # ********************* # エンコーディング # ********************* puts "Default Encoding" print "external : " p Encoding.default_external print "internal : " p Encoding.default_internal sep # ********************* # STDIN エンコーディング # ********************* puts "STDIN Encoding" print "external : " p STDIN.external_encoding print "internal : " p STDIN.internal_encoding sep # ********************* # STDOUT エンコーディング # ********************* puts "STDOUT Encoding" print "external : " p STDOUT.external_encoding print "internal : " p STDOUT.internal_encoding sep # ********************* # テキスト入力 # ********************* file = File.open('日本語.txt').each_line do |line| print line end file.close sep # ********************* # 標準入出力 # ********************* while line = STDIN.gets line = line.chomp! puts "【#{line}】" end sep
▼ コマンドプロンプト用バッチファイルsetlocal @path=%path%;C:\Ruby24-x64\bin dir | ruby.exe std.rb pause endlocal
|
【Ruby 2018の最新記事】
- Ruby(mechanize) で Seesaa のエクスポート
- さくらインターネットに Ruby をインストールして mechanize ( 先に nokogiri のインストールが必要でした )
- Ruby + MySQL + IFRAME + Bootstrap : 問い合せ WEB アプリテンプレート
- Ruby 2.4 で GET/POST メソッドを想定した CGI 用のテンプレート改良版( FORM で MySQL 参照と更新 )
- Ruby 2.4 で GET/POST メソッドを想定した CGI 用の簡易テンプレートを作成してみました
- Windows10 : Ruby で日本語メール送信
- Eclipse + Ruby : win32ole(COM使用の為) + MySQL Connector/ODBC でループ処理をしながら更新
- Pleiades Eclipse 4.7 Oxygen で Ruby を使って MySQL にアクセスする