SQLの窓

2017年02月28日


cp932 の SQLServer に対して、PHP の ODBC 関数に対して UTF8 変換で地道に対応し、特殊なUncode文字は、HTML 数値エンティティで保存する。

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 + 特記事項の最新記事】
posted by lightbox at 2017-02-28 22:03 | Comment(0) | PHP + 特記事項 | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり