Feature #4280

SJIS should be an alias of Windows-31J, not of Shift_JIS

Added by Usaku NAKAMURA over 4 years ago. Updated about 4 years ago.

[ruby-dev:43027]
Status:Closed
Priority:Normal
Assignee:Yui NARUSE

Description

=begin
Rubyのencodingとして「SJIS」を指定する時、指定している人はShift_JISとWindows-31Jの違いを意識してる可能性は低いように思います。
だとすると、1.8までの$KCODE="sjis"がWindows-31Jに対応させられていることから考えて、SJISはShift_JISではなくWindows-31Jのaliasであるべきではないでしょうか?
=end

Associated revisions

History

#1 Updated by Usaku NAKAMURA over 4 years ago

  • Category set to M17N

=begin

=end

#2 Updated by Motohiro KOSAKI over 4 years ago

=begin
FYI:

Javaでは SJIS==Shift_JIS ですね。以下でJavaの歴史的経緯が説明されているようです。

http://www.ingrid.org/java/i18n/encoding/shift_jis.html

=end

#3 Updated by Usaku NAKAMURA over 4 years ago

=begin
こんにちは、なかむら(う)です。

In message " [Ruby 1.9-Feature#4280] SJIS should be an alias of Windows-31J, not of Shift_JIS"
on Jan.14,2011 16:05:56, redmine@ruby-lang.org wrote:

Javaでは SJIS==Shift_JIS ですね。以下でJavaの歴史的経緯が説明されているようです。

http://www.ingrid.org/java/i18n/encoding/shift_jis.html

我々は彼らの失敗を踏まえているので、Shift_JISとWindows-31Jが
ごっちゃになったりはしていません(えっへん)。
よって、IANA charsetにあるような名前をそれと異なる意味にした
いという発想はありません。

で、「SJIS」という名前に対しては特に公的な定義が存在しない状
況のはずです(何かあったら教えてください)。
なので、その意味は慣用で決まっているのだと思いますが、Ruby界
隈においては「$KCODEに指定するもの」というのが最も一般的な現
れ方なのではないかと思うわけです。
であれば、それに合わせるべきではないでしょうか。

さて、JavaではなぜSJIS==Shift_JISなんでしょうか。
Javaの「Shift_JISにまつわる」歴史的経緯は小崎さんに示していた
だいた文書にあるとおりだと思いますが、「SJISについては」特に
なんの説明も無くShift_JISと同じとして扱われてますよね?

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

#4 Updated by Yui NARUSE over 4 years ago

=begin
まだ考え中ですが、今のところ特に反対要素はありません。

まず、現状 SJIS = Shift_JIS なのは、Java にあわせたものです。

しかし、Java の経緯は、
1.1: SJIS == Shift_JIS
1.2: SJIS, Shift_JIS == MS932
1.4.1: SJIS == Shift_JIS, MS932
なのであんまり参考になりません。

IANA Charsets にも SJIS の規定はないので、これも問題ありませんな。
=end

#5 Updated by Motohiro KOSAKI over 4 years ago

=begin
2011年1月14日16:35 U.Nakamura usa@garbagecollect.jp:

こんにちは、なかむら(う)です。

In message " [Ruby 1.9-Feature#4280] SJIS should be an alias of Windows-31J, not of Shift_JIS"
on Jan.14,2011 16:05:56, redmine@ruby-lang.org wrote:

Javaでは SJIS==Shift_JIS ですね。以下でJavaの歴史的経緯が説明されているようです。

http://www.ingrid.org/java/i18n/encoding/shift_jis.html

我々は彼らの失敗を踏まえているので、Shift_JISとWindows-31Jが
ごっちゃになったりはしていません(えっへん)。
よって、IANA charsetにあるような名前をそれと異なる意味にした
いという発想はありません。

で、「SJIS」という名前に対しては特に公的な定義が存在しない状
況のはずです(何かあったら教えてください)。
なので、その意味は慣用で決まっているのだと思いますが、Ruby界
隈においては「$KCODEに指定するもの」というのが最も一般的な現
れ方なのではないかと思うわけです。
であれば、それに合わせるべきではないでしょうか。

さて、JavaではなぜSJIS==Shift_JISなんでしょうか。
Javaの「Shift_JISにまつわる」歴史的経緯は小崎さんに示していた
だいた文書にあるとおりだと思いますが、「SJISについては」特に
なんの説明も無くShift_JISと同じとして扱われてますよね?

実は全然思い出せないんですが、SJISはUnix localeでの名前ではなかったですかね。
個人的にはSJISは統一見解がないから使うなとか言いたいんですがそうもいかない
んでしょうね。
歴史的経緯を含む文字コードは何がやっかいかというと、言語の文字コードの規定と
より下位レイヤーのソフト(データベースソフトとか)での文字コードの規定に不一致が
あったときに困るわけで、Rubyの都合だけで決めていいんだろうかというもやもや感と、
イマドキSJISは理解するけどShift_JIS, CP932を理解しないデータベースなんて生き
残っているのだろうかという漠然とした疑問が頭の中で回っていたりします。

どうなんでしょうねぇ。もうちょっと考えます

=end

#6 Updated by Usaku NAKAMURA over 4 years ago

=begin
こんにちは、なかむら(う)です。

In message " Re: [Ruby 1.9-Feature#4280] SJIS should be an alias of Windows-31J, not of Shift_JIS"
on Jan.14,2011 17:10:00, kosaki.motohiro@gmail.com wrote:

実は全然思い出せないんですが、SJISはUnix localeでの名前ではなかったですかね。
個人的にはSJISは統一見解がないから使うなとか言いたいんですがそうもいかない
んでしょうね。
歴史的経緯を含む文字コードは何がやっかいかというと、言語の文字コードの規定と
より下位レイヤーのソフト(データベースソフトとか)での文字コードの規定に不一致が
あったときに困るわけで、Rubyの都合だけで決めていいんだろうかというもやもや感と、
イマドキSJISは理解するけどShift_JIS, CP932を理解しないデータベースなんて生き
残っているのだろうかという漠然とした疑問が頭の中で回っていたりします。

どうなんでしょうねぇ。もうちょっと考えます

真面目なプログラムはSJISとかいうどう考えてもヤバい名前は使わ
ないと思うんですよね。
データベースアクセスするのにSJISとか書く人は思う存分はまれば
いいと思うので、まあいいんじゃないでしょうか。

なんですが、Unix localeとか出てくるとちょっとまずいかもという
気はします。
なんかデフォルトの日本語localeがSJISなUnixがあったような気が
するんですが、なんだったかしら。AIXあたり?
そしてそいつのlocale名は何でその実体はなんだったのかしら...

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

#7 Updated by Yui NARUSE over 4 years ago

=begin
2011年1月14日17:29 U.Nakamura usa@garbagecollect.jp:

こんにちは、なかむら(う)です。

In message " Re: [Ruby 1.9-Feature#4280] SJIS should be an alias of Windows-31J, not of Shift_JIS"
on Jan.14,2011 17:10:00, kosaki.motohiro@gmail.com wrote:

実は全然思い出せないんですが、SJISはUnix localeでの名前ではなかったですかね。
個人的にはSJISは統一見解がないから使うなとか言いたいんですがそうもいかない
んでしょうね。
歴史的経緯を含む文字コードは何がやっかいかというと、言語の文字コードの規定と
より下位レイヤーのソフト(データベースソフトとか)での文字コードの規定に不一致が
あったときに困るわけで、Rubyの都合だけで決めていいんだろうかというもやもや感と、
イマドキSJISは理解するけどShift_JIS, CP932を理解しないデータベースなんて生き
残っているのだろうかという漠然とした疑問が頭の中で回っていたりします。

どうなんでしょうねぇ。もうちょっと考えます

真面目なプログラムはSJISとかいうどう考えてもヤバい名前は使わ
ないと思うんですよね。
データベースアクセスするのにSJISとか書く人は思う存分はまれば
いいと思うので、まあいいんじゃないでしょうか。

なんですが、Unix localeとか出てくるとちょっとまずいかもという
気はします。
なんかデフォルトの日本語localeがSJISなUnixがあったような気が
するんですが、なんだったかしら。AIXあたり?
そしてそいつのlocale名は何でその実体はなんだったのかしら...

http://home.m05.itscom.net/numa/cde/sjis-euc/sjis.html
Unixだと例えばこんな。

しかし、Unicodeとの対応がどんなもんかはまたよくわからんすな。

--
NARUSE, Yui
naruse@airemix.jp

=end

#8 Updated by Motohiro KOSAKI over 4 years ago

=begin

真面目なプログラムはSJISとかいうどう考えてもヤバい名前は使わ
ないと思うんですよね。
データベースアクセスするのにSJISとか書く人は思う存分はまれば
いいと思うので、まあいいんじゃないでしょうか。

なんですが、Unix localeとか出てくるとちょっとまずいかもという
気はします。
なんかデフォルトの日本語localeがSJISなUnixがあったような気が
するんですが、なんだったかしら。AIXあたり?
そしてそいつのlocale名は何でその実体はなんだったのかしら...

ロケール名はわかりませんでしたが、

https://www-304.ibm.com/support/docview.wss?uid=std383ebe99c4d8d16e7492574d600087fe7
http://publibn.boulder.ibm.com/doc_link/Ja_JP/a_doc_lib/aixbman/codebook/jp_codebook.pdf

を見ると実体はIBM943みたいです。

=end

#9 Updated by Yui NARUSE over 4 years ago

=begin
(2011/01/14 19:04), SATOH Fumiyasu wrote:

At Fri, 14 Jan 2011 17:29:53 +0900,
U.Nakamura wrote:

なんですが、Unix localeとか出てくるとちょっとまずいかもという
気はします。
なんかデフォルトの日本語localeがSJISなUnixがあったような気が
するんですが、なんだったかしら。AIXあたり?
そしてそいつのlocale名は何でその実体はなんだったのかしら...

AIX の日本語の既定 locale の名前は Ja_JP で Shift_JIS でも
CP932 でも CP943 でもない Shift_JIS の亜種らしいです。
ほかに Ja_JP.IBM-943、ja_JP.IBM-932 とかがあります。
ja_JP.SJIS はありません(と記憶している)。

AIX では「AIX 5L 日本語コード一覧表(SC88-0427) 」を読むに、
* 「SJIS」はない
* AIX 4.3.2 以前は IBM932、以降は IBM943
* 文字集合はマイクロソフト標準キャラクタセットと同一
* IBM943 は 0x5C == U+005C
* Unicode への変換は Shift_JIS 風 (0x5C 以外)
http://publibn.boulder.ibm.com/doc_link/Ja_JP/a_doc_lib/aixbman/codebook/jp_codebook.pdf

しかし、以下のような話もあり、混乱もある模様。
http://www-01.ibm.com/support/docview.wss?uid=std3c2d180a83715c3a149256ec400280bf4
http://www.hi-matic.org/diary/?20090514

Solaris の Windows 同等の locale 名は ja_JP.PCK です。
ja_JP.SJIS はありません。

そういえば PCK は nkf でサポート希望来ましたな。
ruby でも alias 追加するか、replica にするか。

で、こいつは何者かというと、


PC 漢字コード
PC 漢字コード (以降、PCK とします) は、一般に「シフト JIS (あるいは MS 漢字) コード」と呼ばれ、
Microsoft が Windows 3.1 で規定したマイクロソフト標準キャラクタセットと同等の文字集合および
エンコーディングを提供するものです。ja_JP.PCK ロケールで日本語を表現する文字コード体系として
使われています。PCK に関する詳細は、PCK(5) マニュアルページを参照してください。」
http://download.oracle.com/docs/cd/E19253-01/819-0364/japan.utility-10006/index.html


とあり、後ろに付いてる変換規則も見ると、
「PC 漢字コードと UTF-8 の変換は、内部で一旦変換元のコードセットから日本語 EUC に変換し、
 そこから目的のコードセットへ変換します。」
とある。

じゃあ、PCK と 日本語 EUC の変換はと見ると、
日本語 EUC と PCK の文字コード変換規則は『TOG 日本ベンダ協議会』の日本語 EUC・シフト JIS
コード変換仕様』に基づいています。」
とあるので、これですね。
http://home.m05.itscom.net/numa/cde/sjis-euc/sjis-euc.html

で、この日本語 EUC と Unicode の変換規則は何かというと、どうも eucJP-ascii なようですね。
「JIS X 0221 式の変換 (ASCII と併用する場合)」
http://home.m05.itscom.net/numa/cde/ucs-conv/appendix.html

http://download.oracle.com/docs/cd/E19253-01/819-0606/x-2chn0/index.html
http://download.oracle.com/docs/cd/E19253-01/819-0606/appb-pckwarn-1/index.html

日立の HI-UX (HP-UX の亜種) に ja_JP.SJIS という locale が
ありますが、これが Shift_JIS か亜種 (CP932?) であるかは覚えていない…。
HP-UX にも ja_JP.SJIS はあったかなぁ?

HP-UX は SJIS/SJISMS で分けているように見えますね。
http://docs.hp.com/ja/5991-1165/ch02s06.html

総じて見ると、「ここで,SJISとはMicrosoft が Windows 3.1 で規定した
 「マイクロソフト標準 キャラクタセット」のこととする.」って感じみたいですな。
http://home.m05.itscom.net/numa/cde/sjis-euc/sjis-euc.html

ただ、変換表はどうかというと、eucJP-ascii 経由っぽい雰囲気も。

--
NARUSE, Yui naruse@airemix.jp

=end

#10 Updated by Usaku NAKAMURA over 4 years ago

=begin
こんにちは、なかむら(う)です。

In message " Re: [Ruby 1.9-Feature#4280] SJIS should be an alias of Windows-31J, not of Shift_JIS"
on Jan.17,2011 20:01:21, kosaki.motohiro@jp.fujitsu.com wrote:

1点気になるのは非互換なんですが、「ぎゃっ」と声がするかどうかで確認する
作戦だという理解でいいのでしょうか?

自分でSJISを指定してる人は、最初から書いてるように、単にうか
つな人なので勝手に叫べ、という感じです。

で、自分でそう書いてないのにSJISとして取り扱われてる人なんて
いるわけないよねーははは、と思っていたわけなんですが、Unixの
localeが*.SJISの場合のみそういうことが起きるということに小崎
さんの指摘で気付いたので確認してたという感じです。

できれば「ぎゃっ」と叫ばせる前に確認したいわけですが、現実問
題としてはWindowsと互換でない前提でSJISというlocaleをわざわざ
使ってる奇特な人なんてほとんどいないと想像できるので、見切り
をつけてやってみてはどうか、という気分に傾いてはいます。

いずれにせよ、Ruby M17Nの権威、成瀬さんがどう判断するか、なの
ですが。

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

#11 Updated by Yui NARUSE over 4 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

=begin
This issue was solved with changeset r31074.
Usaku, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

=end

Also available in: Atom PDF