Oracle(SJIS)とPHPでWebシステムを作る際、PHP側の文字コードをSJIS・UTF-8どちらにするか悩んでいます。


Linux(CentOS)、Apache、Oracle(SJIS)、PHPで webシステムを作ることになったのですが、
oracle + PHP の開発経験がないので
PHP側の文字コードが SJIS、UTF-8 どちらが良いか分からず悩んでいます。

一度
・PHPの文字コードをSJIS、php_info()のenvironment→NLS_LANG=Japanese_Japan.JA16SJIS
・PHPの文字コードをUTF-8、php_info()のenvironment→NLS_LANG=Japanese_Japan.AL32UTF8
で簡単なプログラムを組んで SELECT、INSERT、UPDATEは試してみたところ、
どちらも文字化けせず問題なさそうでした。
(DB接続はOCI8関数を使いました)
自分としては、PHP側はSJISを使わずUTF-8を使いたいのですが
SJISを使ってoracleと文字コードを統一した方が文字化けなどでそこまで詰まらなそうなので
SJISの方が良いのかもしれないのでは?と思っています。

ですので、PHP側がどちらの文字コードがオススメか、分かる方がいましたら教えてください。
その理由もお聞かせいただけると嬉しいです。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/11/21 21:16:38
  • 終了:2012/11/27 01:49:14

ベストアンサー

id:a-kuma3 No.3

a-kuma3回答回数4367ベストアンサー獲得回数18032012/11/21 22:15:28

ポイント200pt

SJISを使ってoracleと文字コードを統一した方が文字化けなどでそこまで詰まらなそうなので
SJISの方が良いのかもしれないのでは?と思っています。

ある意味、感覚としては正しいと思います。
ただし、いくつかの例外を除けば。
人はそのいくつかの例外のことを、バッドノウハウと呼んだりします。

http://oku.edu.mie-u.ac.jp/~okumura/php/sjis.html
まず、有名なのは 2byte目が 0x5c の2byte文字の問題。
文字リテラル内で、特殊な文字をエスケープする¥と、2byte文字の 2byte目の 0x5c を同等に扱ってしまいます。
古くは、C言語や Perl のときから、お馴染みの問題です。

PHP では、さらにこんな問題も。

 この文字化けは、PHPのMagic Quote GPC(Get Post Cookie)という設定とShift-JISの文字コードの組み合わせが原因になって起こります。

http://www.syon.co.jp/syontech/tech003.html


じゃあ、0x5c だけを気を付けていれば良いのか、というと PHP は 0x5d にも気を使う必要があるそうです。

配列のキーにSJISを使っていて、PHPがUTF-8である場合、特定の文字でキー文字列がブチ切られるのです。

http://lab.flama.co.jp/archives/355

おっと、こちらは PHP が UTF-8 ですね。
ページが SJIS で、そこからのリクエストを UTF-8 な PHP が受ける、というちょっと特殊な感じですが。


どちらにしろ、2byte文字の扱いが甘い言語を使う場合には、こういった事柄について正しい知識と、それらが引き起こす問題から逃げない姿勢が、一番大事だと思います。

id:otomex

回答ありがとうございます。

5C問題はSJISを避けたい理由の一つでした。
0x5dは知りませんでした。他にもあったのですね。

今まで「何となくは知っている」で来てしまったので、
文字コードについて再度勉強し、正しく理解したいと思います。

2012/11/23 23:21:58
id:a-kuma3

DB の文字コードが SJIS ってのが厳しいですよね。
ページの charset や、処理する php を UTF-8 にした場合、UTF-8 → SJIS で対応する文字が無い、というケースをどう処理するのかが、悩みの種です X-|

2012/11/23 23:29:42

その他の回答(2件)

id:pigmon88 No.1

pigmon88回答回数501ベストアンサー獲得回数252012/11/21 22:04:21

回答取り消し

id:oil999 No.2

oil999回答回数1728ベストアンサー獲得回数3202012/11/21 22:11:55

ポイント100pt

要件がよく分からないのですが、Web側(PHP側)からOracleへのデータ登録が発生するのであれば、Web側(PHP側)もSJISにすることをお勧めします。
たとえばHTML5に準拠したサイトを作るのであればUTF-8にすることが望ましいのですが、UTF-8で入力された文字の一部について、対応するSJISコードがないため、Oracleに登録する際に文字化けするためです。

新常用漢字表が迫るUnicode移行、「シフトJIS」では対応不可能

http://itpro.nikkeibp.co.jp/article/COLUMN/20091209/341831/

id:otomex

回答ありがとうございます。

商品の名前や在庫データを修正するといったシステムなので、データ登録は発生します。
SJISに対応しない文字がここまであるとは知りませんでした。
対応しない文字は弾くなど、処理が増えることも考えないといけないのですね。

2012/11/23 23:28:39
id:a-kuma3 No.3

a-kuma3回答回数4367ベストアンサー獲得回数18032012/11/21 22:15:28ここでベストアンサー

ポイント200pt

SJISを使ってoracleと文字コードを統一した方が文字化けなどでそこまで詰まらなそうなので
SJISの方が良いのかもしれないのでは?と思っています。

ある意味、感覚としては正しいと思います。
ただし、いくつかの例外を除けば。
人はそのいくつかの例外のことを、バッドノウハウと呼んだりします。

http://oku.edu.mie-u.ac.jp/~okumura/php/sjis.html
まず、有名なのは 2byte目が 0x5c の2byte文字の問題。
文字リテラル内で、特殊な文字をエスケープする¥と、2byte文字の 2byte目の 0x5c を同等に扱ってしまいます。
古くは、C言語や Perl のときから、お馴染みの問題です。

PHP では、さらにこんな問題も。

 この文字化けは、PHPのMagic Quote GPC(Get Post Cookie)という設定とShift-JISの文字コードの組み合わせが原因になって起こります。

http://www.syon.co.jp/syontech/tech003.html


じゃあ、0x5c だけを気を付けていれば良いのか、というと PHP は 0x5d にも気を使う必要があるそうです。

配列のキーにSJISを使っていて、PHPがUTF-8である場合、特定の文字でキー文字列がブチ切られるのです。

http://lab.flama.co.jp/archives/355

おっと、こちらは PHP が UTF-8 ですね。
ページが SJIS で、そこからのリクエストを UTF-8 な PHP が受ける、というちょっと特殊な感じですが。


どちらにしろ、2byte文字の扱いが甘い言語を使う場合には、こういった事柄について正しい知識と、それらが引き起こす問題から逃げない姿勢が、一番大事だと思います。

id:otomex

回答ありがとうございます。

5C問題はSJISを避けたい理由の一つでした。
0x5dは知りませんでした。他にもあったのですね。

今まで「何となくは知っている」で来てしまったので、
文字コードについて再度勉強し、正しく理解したいと思います。

2012/11/23 23:21:58
id:a-kuma3

DB の文字コードが SJIS ってのが厳しいですよね。
ページの charset や、処理する php を UTF-8 にした場合、UTF-8 → SJIS で対応する文字が無い、というケースをどう処理するのかが、悩みの種です X-|

2012/11/23 23:29:42

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません