[PHP-users 33212] Re: PHP5+MSSQLSERVER2005での中国語の取得について

goungoun gounx2 @ gmail.com
2008年 1月 31日 (木) 23:16:05 JST


こんにちは。

興味があったので、
ネットで検索してみたり、
PHPのソースを覗いてみました。

以下は、全くの未検証です。

Windows上のPHP5とSQLServerということで、
構成としてはこんな感じでしょうか。

〜〜〜〜〜〜〜〜〜〜〜〜〜
SQLServer
  ↓
  ↓           DB Server側
=========================
  ↓           DB Client側
  ↓
  ↓
ドライバ(ODBCとか)
  ↓
Client(PHP5)
〜〜〜〜〜〜〜〜〜〜〜〜〜

クライアントのコードページ(codepage)
は日本語Windowsの場合デフォルトで
932(S-JIS)なので、
そのあたりをドライバが考慮して
SQLServer側のデータがUNICODEであっても
Client(PHP5)へ渡すときはS-JISになっている
ような気がします。
UTF-8のコードページは65001だそうです。

ということで、クライアントのコードページを
何とかして932から65001に変更すれば
文字化けしなくなるのでは?と予測

# これが原因なら、
# VBSとかからつないでも文字化けするような?

方法としては2つでしょうか。
(Windows本体のデフォルトのコードページを
変更するという手もあるのかもしれませんが
あまり現実的ではなさそうなので除外)

A.
(IIS経由ではこの方法は使えませんが)
コマンドラインから
chcp 65001
としておき、スクリプトを実行してみる。

B.
サーバに接続するときのオプションでコードページを指定してみる。
ODBCの接続オプションでCPになるそうです。
sqlsrv_connectのオプションもODBCのオプションと同じそうです。

余談ですが、
文字コードを確認する手段として
mb_detect_encoding()を利用されていますが、
100%の保障はなかったと思います。
確実に確認するならバイナリレベルで見ないとわからないはずです。
現に
>  ■sqlsrv関数で抽出(MSが提供しているドライバ)
>   mb_detect_encodingで返される文字コード:EUC
のように、なぜEUCになったのか謎?

それと、googleから
sqlserver nvarchar php
で検索してもいくつか同じ問題についての話や情報が
出てきましたよ。
解決までは至っていないようですが以下のような過去ログもありました。

[PHP-users 30792] SQL Serverで、nvarcharの値がShift_JISで帰ってくる
http://ml.php.gr.jp/pipermail/php-users/2006-November/031309.html

ついでのメモ
LinuxのPHPの場合、
mssqlエクステンションは、FREETDSというライブラリを使っているらしい。
php.iniにmssql.charsetがコードページ指定っぽい。




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