エンコーディングのつづき

ありがたいことに成瀬さんからコメントを頂いたので昨日の続き。

結論から言うと、コメント頂いた通り、スクリプトWindows-31J で書けば、何も迷うことはありません。

環境変数 LANG が ja_JP.SJIS なのは間違ってるけど、Encoding.default_external が Windows-31J になっているので深追いしないことにする。(^_^;

#!/usr/local/bin/ruby19
# -*- coding: cp932; -*-

RUBY_VERSION                    # => "1.9.1"
ENV['LANG']                     # => "ja_JP.SJIS"

__ENCODING__                    # => #<Encoding:Windows-31J>

Encoding.default_external       # => #<Encoding:Windows-31J>
Encoding.default_internal       # => nil
Encoding.locale_charmap         # => "Windows-31J"

`rm -rf encoding.txt`

str = "こんにちは"
str.encoding                    # => #<Encoding:Windows-31J>

open('encoding.txt', 'w'){|f| f.puts str}

buf = open('encoding.txt'){|f| f.read}
buf.encoding                    # => #<Encoding:Windows-31J>

Encoding.compatible?(str.encoding, buf.encoding) # => #<Encoding:Windows-31J>

Regexp.new(str) =~ buf          # => 0

プログラミング言語 Ruby (p.40) を読み直してた。

Ruby 1.9 は、少なくとも、ASCII-8BIT (BINARY とも呼ばれる)、US-ASCII (7 ビット ASCII)、IOS-8859-1*1 から ISO-8859-15 までのヨーロッパのエンコーディングUnicodeUTF-8 エンコーディング、日本語エンコーディングSHIFT_JIS (SJIS とも呼ばれる)、EUC-JP をサポートする。手持ちの Ruby 次第では、これ以外のエンコーディングをサポートしている場合がある。
  • Ruby 1.9 は、少なくとも、
  • 手持ちの Ruby 次第では ……

これを読み落したばっかりに Windows-31J で書けないと思い込んでいた。


試してみたところ Meadow*2 の magic comment では、以下は全てエラーになった。

以下なら OK.

動作を見ていると Meadow からは、どちらも Windows-31J らしい。

そして新たな疑問

# -*- coding: cp932; -*-

__ENCODING__                  # => #<Encoding:Windows-31J>
str = 'あいう(1)'
str.encoding                  # => #<Encoding:Windows-31J>
str.valid_encoding?           # => true

str.force_encoding("Shift_JIS")
str.encoding                  # => #<Encoding:Shift_JIS>
str.valid_encoding?           # => true

コード中の (1) は実際には○数字の 1 (0x8740)

最後の String.valid_encoding? は false じゃないの?
やっぱり根本的に Shift_JISWindows-31J を理解できてない?

*1:ISO-8859-1 の間違い?

*2:Meadow 3.00-dev (KIKU)/emacs 22.1.1/mule 5.0 を使用中。