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 を使う場合の注意事項 ( 古い社内アプリ移行時必見 )
|
【PHP + 特記事項の最新記事】
- PHP のファイルアップロードで画像ファイルを限定で行う為のテンプレートと注意事項と解説
- PHP : 指定ファイル名でダウンロード 『application/octet-stream』 と 『Content-disposition: attachment』
- PHP の関数で規定されているキャッシュコントロールの無効 : session_cache_limiter( 'nocache' )
- PHP : 一定時間前のファイルの削除
- PHP : ${'日本語表示'} という可変変数と、${hello . "X"} という連結可変変数
- pChart2 に JKゴシックとラノベポップを使ってサンプルを作りました
- PHP の ImageMagick で作成した PNG 画像にオフセットが設定されてしまった場合の対応方法
- PHP : 連想配列を「オブジェクト」に変換(キャスト)するとうまく動きますが、通常配列では参照できないようです
- PHP でエラーが表示されない場合の ini_set( 'display_errors', "1" ) 使用時の注意事項
- 特に変更しても支障の無い error_append_string php.ini ディレクティブを使用して PHP 全体のデバッグに利用する
- PHP : 日本語を使った変数( 特殊文字列で変数 ) / 変数名を文字列として扱う
- PHPの真偽値
- PHP : include_path の設定
- PHP : 漢字スペースも trim