LoginSignup
6
2

More than 3 years have passed since last update.

Windowsにてp "日本語"で"日本語"を表示させる方法

Posted at

Ruby on WindowsのFAQシリーズ

初学者からよく聞く

nihongo.rb
p "日本語"
p ["日本語"]
p "日本語": :"日本語"

"\u65E5\u672C\u8A9E"
["\u65E5\u672C\u8A9E"]
{:"\u65E5\u672C\u8A9E"=>:"\u65E5\u672C\u8A9E"}

となる問題です。

ちなみに脳筋回答

コンソールに日本語表示させる必要なんて無いんじゃない?
(割と真面目に、Rubyのpによる日本語表示をwindowsでやる必要は無いと思ってます)

真面目回答

出力が真の意味で文字化けする危険性がある
スクリプトの頭に

Encoding.default_internal = __ENCODING__

付けとけ

p "日本語"とは?

Kernel.#p

引数を人間に読みやすい形に整形して改行と順番に標準出力 $stdout に出力します。主にデバッグに使用します。

引数の inspect メソッドの返り値と改行を順番に出力します。つまり以下のコードと同じです。

print arg[0].inspect, "\n", arg[1].inspect, "\n", ...

つまり、p("日本語")puts "日本語".inspectとなります。

p "日本語".encoding         # => #<Encoding:UTF-8>
p "日本語".inspect          # => "\"\\u65E5\\u672C\\u8A9E\""
p "日本語".inspect.encoding # => #<Encoding:Windows-31J>

なので、"日本語".inspectの時点で\u表記への変換が行われている事
および、その理由が文字コードを変換しつつ元の情報を損なわないための措置という事がわかります。

"日本語".encodingるりま: 多言語化

リテラルのエンコーディング
文字列リテラル、正規表現リテラルそしてシンボルリテラルから生成されるオブジェクトのエンコーディングは スクリプトエンコーディングになります。

現在のスクリプトエンコーディングは __ENCODING__ により取得することができます。

とある通り、スクリプトエンコーディング(__ENCODING__)によって取得できます。
また、Ruby2.0以降のスクリプトエンコーディングの既定はUTF-8です

では、"日本語".inspectは?というと
るびマ Ruby M17N の設計と実装

Encoding.default_internal が設定されている場合は、全ての入力された String のエンコーディングは Encoding.default_internal の返すエンコーディングと等しいと仮定することが可能になります。この場合、ライブラリが返す文字列も Encoding.default_internal になっているべきです。

ライブラリが返す文字列は、Encoding.default_internalになっているべき という事なのでEncoding.default_internalによって指定できる事がわかります。

結論

Encoding.default_internal = __ENCODING__

を行うことによって、String#inspectが返す文字列を文字列リテラルと同じエンコーディングにできる。

問題点

Windowsではlocaleがcp932なので
文字列内に絵文字などのcp932に変換できない文字を含むと文字化けします。
この問題のためにdefault_internalnilの場合はdefault_externalを代替エンコーディングとして使っていると推測できます。

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2