Microsoft のドライバで自動的に対応させる方法もありますが、かつて切り替え時期に Microsoft 純正を使ってえらい目にあった経緯があり、全て SHIFT_JIS で現在も運用していますが、jQuery の ajax を使用するに当たってどうしても通信部分は UTF-8 になるため、以下のようにしています。
また、国際化のためどうしても SHIFT_JIS に無い文字に対応する必要も出てきました。
まず、以下のソースは SHIFT_JIS で書かれており、mb_convert_encoding が不可欠なので、先頭で内部コードを UTF-8 に設定しています。
<?php
mb_internal_encoding("UTF-8");
require_once( "../db.php" );
// *************************************
// キャラクタセット
// *************************************
header( "Content-Type: application/json; charset=utf-8" );
// *************************************
// キャッシュ無効
// *************************************
session_cache_limiter('nocache');
session_start();
// ajax の為、入力値は UTF-8
foreach( $_POST as $Key => $Value ) {
if ( $Key == "name" || $Key == "name2" ) {
$_POST[$Key] = mb_encode_numericentity( $Value, array(0x0, 0x2FFFF, 0, 0xFFFFF) );
}
else {
$_POST[$Key] = mb_convert_encoding( $Value, "cp932", "UTF-8" );
}
}
// *************************************
// 処理
// *************************************
$SQL = new DBSS( $COMMON_DB, "sa" );
$query = "update SQLServerのテーブル set";
$query .= " 姓 = '{$_POST["name"]}'";
$query .= " ,名 = '{$_POST["name2"]}'";
$query .= " where 番号 = {$_POST["no"]}";
$_POST['query'] = $query;
$ret = $SQL->Execute( $query );
if ( $ret === false ) {
$_POST['status'] = 0;
}
else {
$_POST['status'] = 1;
}
// *************************************
// PHP の結果を result キーで
// JSON としてブラウザに返す
// *************************************
foreach( $_POST as $Key => $Value ) {
$_POST[$Key] = mb_convert_encoding( $Value, "UTF-8", "cp932" );
}
print json_encode($_POST);
?>
この処理は、jQuery から呼び出された更新処理です。name と name2 に、HTML 数値エンティティに変換すべき文字列が入っています。全て変換する必要は無いのですが、SHIFT_JIS と Unicode の云々の詳細を省く為に array(0x0, 0x2FFFF, 0, 0xFFFFF) となっています。
0x0 〜 0x2FFFF : オフセット 0、マスク 0xFFFFF
ここでは、サンプルとしてのコードなので、入力文字列が name と name2 しかないので、mb_convert_encoding( $Value, "cp932", "UTF-8" ) が実行されませんが、一般的な SHIFT_JIS の文字列のデータに対して必要です。
print する場合は、jQuery の中に戻るので、再度 UTF-8 に変換する必要があります。
以下は同様の処理で、読み出すだけのコードです。
<?php
mb_internal_encoding("UTF-8");
require_once( "../db.php" );
// *************************************
// キャラクタセット
// *************************************
header( "Content-Type: application/json; charset=utf-8" );
// *************************************
// キャッシュ無効
// *************************************
session_cache_limiter('nocache');
session_start();
// ajax の為、入力値は UTF-8
foreach( $_POST as $Key => $Value ) {
$_POST[$Key] = mb_convert_encoding( $Value, "cp932", "UTF-8" );
}
// *************************************
// 処理
// *************************************
$SQL = new DBSS( $COMMON_DB, "sa" );
$query = "select * from SQLServerのテーブル where 番号 = {$_POST["no"]}";
$column = $SQL->QueryEx( $query );
if ( $column ) {
foreach( $column as $Key => $Value ) {
$fld = mb_convert_encoding( $Key, "UTF-8", "cp932" );
if ( $Key == "姓" || $Key == "名" ) {
$column2[$fld] = mb_decode_numericentity( $Value, array(0x0, 0x2FFFF, 0, 0xFFFFF) );
}
else {
$column2[$fld] = mb_convert_encoding( $Value, "UTF-8", "cp932" );
}
}
$_POST['exist'] = 1;
}
else {
$_POST['exist'] = 0;
}
// *************************************
// PHP の結果を result キーで
// JSON としてブラウザに返す
// *************************************
foreach( $_POST as $Key => $Value ) {
$_POST[$Key] = mb_convert_encoding( $Value, "UTF-8", "cp932" );
}
$_POST['data'] = $column2;
print json_encode($_POST);
file_put_contents("debug.log", print_r($_POST, true));
?>
ここで、一番重要なのは、HTML 数値エンティティ を mb_decode_numericentity で元の文字列に戻す事です。これでブラウザから貼り付けれる文字であれば、DB には HTML 数値エンティティ で保存されて、表示すると元に戻るはずです。
※ ただ、DB 側の列の文字列サイズがかなり大きくなります。
ちなみに、Excel への変換は、IE を使用してブラウザからの Excel オフジェクト呼び出しでまかなっています。
▼
IE11 で VBScript を使う場合の注意事項 ( 古い社内アプリ移行時必見 )