[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 メーリングリストの案内