[PHP-dev 1099] Re: mbstring のエンコーディング名

Hideki Noma noma @ humeia.ad.jp
2005年 1月 18日 (火) 10:40:20 JST


野間です。

ちょこっと調べましたので、コメントしておきます。
ぢょ〜さんその他、PHP強者のお歴々フォローをお願いします。

綾乃介さん> あとは、Shift_JISがSJISなのかSJIS-WINなのかが気になるところです。

mbstring モジュールについて確認しておきました。
結論からいうと、mbstring モジュールにおいて Shift_JIS では、
cp932 なのか、 sjis なのかの区別をつけていないという
ことになります。
MIMEでは同一のShift_JISを用いられているが、PHP内では区別されるという
意味で、敢えてPHP内部では別の識別名をつけているようです。
(Shift_JIS = SJIS という政治的な判断を避けたとも言えます)

ただし、文字コードを割出す部分では mbfl_encoding_ptr_list に、
sjisが先に現れますので、Shift_JISとした場合には、現行の SJIS 
を指定するのと同じ結果が得られると思われます。

libmbfl/filters/mbfilter_sjis.c では
以下のように定義されてます。
static const char *mbfl_encoding_sjis_aliases[] = {"x-sjis", "SHIFT-JIS", NULL};
const mbfl_encoding mbfl_encoding_sjis = {
        mbfl_no_encoding_sjis,
        "SJIS",       <--- PHP 内の name
        "Shift_JIS",  <--- Mime name
        (const char *(*)[])&mbfl_encoding_sjis_aliases,
        mblen_table_sjis,
        MBFL_ENCTYPE_MBCS
};

libmbfl/filters/mbfilter_cp932.c では
以下のように定義されてます。
static const char *mbfl_encoding_sjis_win_aliases[] = {"SJIS-open", "CP932", "Windows-31J", "MS_Kanji", NULL};
const mbfl_encoding mbfl_encoding_sjis_win = {
        mbfl_no_encoding_sjis_win,
        "SJIS-win",       <--- PHP 内の name
        "Shift_JIS",  <--- Mime name
        (const char *(*)[])&mbfl_encoding_sjis_win_aliases,
        mblen_table_sjis,
        MBFL_ENCTYPE_MBCS
};


php_mbregex.c
static int _php_mb_regex_name2mbctype(const char *pname)
という関数では

                } else if (strcasecmp("SJIS", pname) == 0
                           || strcasecmp("CP932", pname) == 0
                           || strcasecmp("MS932", pname) == 0
                           || strcasecmp("SHIFT_JIS", pname) == 0
                           || strcasecmp("SJIS-WIN", pname) == 0) {
                        mbctype = MBCTYPE_SJIS;

となっているので、正規表現では区別されていないです。

> こんにちは。綾乃介です。
> 
> 実験結果を考えるとShift_JISでも有効と言うことかと思いますが。
> マニュアルをSJISからShift_JISにしませんか?(まだ確認は必要だと思います)
> その方がよりユーザフレンドリーな言語になると思います。

賛同しようかと思いましたが、文字コードに関する混乱をなんとかしないと
切りかえられないです。

なんで、MIMEで使用される文字コード名とは別になっているのかは
きちんとドキュメント化することが必要です。

ちなみに、Shift_JIS については
http://www.iana.org/assignments/character-sets
ではPHPのSJISに相当します
Name: Shift_JIS  (preferred MIME name)
MIBenum: 17
Source: This charset is an extension of csHalfWidthKatakana by
        adding graphic characters in JIS X 0208.  The CCS's are
        JIS X0201:1997 and JIS X0208:1997.  The
        complete definition is shown in Appendix 1 of JIS
        X0208:1997.
        This charset can be used for the top-level media type "text".
Alias: MS_Kanji 
Alias: csShiftJIS

sjis-winはIANA的には以下になりますね。
Name: Windows-31J
MIBenum: 2024
Source: Windows Japanese.  A further extension of Shift_JIS
        to include NEC special characters (Row 13), NEC
        selection of IBM extensions (Rows 89 to 92), and IBM
        extensions (Rows 115 to 119).  The CCS's are
        JIS X0201:1997, JIS X0208:1997, and these extensions.
        This charset can be used for the top-level media type "text",
        but it is of limited or specialized use (see RFC2278).
        PCL Symbol Set id: 19K
Alias: csWindows31J

ただし、(preferred MIME name) は付加されていないので、
MIMEで使用する場合に、何をCharacter code として用いればいいのかは
決められていません。
→ "Windows-31J" をMIMEで使用するのは望ましくないということになるようです。


PHP-dev メーリングリストの案内