Ajax 日本語処理

  クライアントからは必ず utf-8 渡しになる ( 共通 )



以下は、ボタンの文字列を送信する例ですが、encodeURIComponent でエンコードされたデータは、クライアントのキャラクタセットにかかわらず、utf-8 になります
( クライアントページのキャラクタセットは何でもかまいません )

気をつけるのは、日本語又は記号を渡す時に encodeURIComponent を使用するのを忘れない という事です。
( Google MAP のクライアントコードにもきっちり使われています )

※ 内容の解らない入力データ等は必ずエンコードすれば良いです。仕様の決まったコードなら必要無いでしょう。

  
<HTML>
<HEAD>
<META http-equiv="content-type" content="text/html; charset=shift_jis">
<SCRIPT language="javascript" type="text/javascript">

	var dom,bIE;
	var objXMLHttp;

	if ( document.all ) {
		bIE = true;
		dom = new ActiveXObject("Msxml2.DOMDocument.3.0");
		objXMLHttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
	}
	else {
		bIE = false;
		dom = document.implementation.createDocument("", "", null);
		objXMLHttp = new XMLHttpRequest();
	}

function SendNihongo(  ) {

	var result;
	var ndata = document.getElementsByName("send")[0].value;
	ndata = encodeURIComponent(ndata);

	// 最後のパラメータの false は、同期実行を意味します
	objXMLHttp.open(
		"GET",
		"http://winofsql.jp/realwebapp/ndata.php?" +
		"value=" + ndata
		, false );
	objXMLHttp.send( "" );
	result = objXMLHttp.responseText;

	alert(result);

}

</SCRIPT>
</HEAD>
<BODY>
<INPUT type=button name="send" value="送信" onClick='SendNihongo( )'>
</BODY>
</HTML>
  



  PHP ( Shift_JIS )



HTTP ヘッダーの charset と、実際のデータのキャラクタセットが一致している必要があります。
( それさえ守れば、サーバーから出力するキャラクタセットはなんでもかまいません )

※ 静的なファイルでは、HTTP ヘツダーに charset を付加できない為、
※ デフォルトのutf-8 で書かないとクライアント側で正しく取得できません。

ソースコードのキャラクタセットは、ソースコード外部のデータのキャラクタセットによって決めると良いでしょう
( ファイルや DB )

  
<?
header( "Content-Type: text/html; Charset=shift_jis" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );

# PHP によって変換されてしまったコードを元に戻す
foreach( $_GET as $Key => $Value ) {
	$_GET[$Key] = str_replace("\\\\", "\\", $Value );
	$_GET[$Key] = str_replace("\\'", "'", $_GET[$Key] );
	$_GET[$Key] = str_replace("\\\"", "\"", $_GET[$Key] );
}

# 内部コードは utf-8 にしておく( なるべく問題が起こらないように )
mb_language( "ja" );
mb_internal_encoding("UTF-8");

# 入力は utf-8 なので、shift_jis に変換
$sjis = mb_convert_encoding($_GET['value'], 'SHIFT_JIS', 'UTF-8');

# shift_jis で比較
if ( $sjis == '送信' ) {
	$sjis = '送信を受信しました';
}

# Charset=shift_jis なので、そのまま返す
print $sjis;

?>
  



  PHP ( EUC-JP )

  
<?
header( "Content-Type: text/html; Charset=euc-jp" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );

foreach( $_GET as $Key => $Value ) {
	$_GET[$Key] = str_replace("\\\\", "\\", $Value );
	$_GET[$Key] = str_replace("\\'", "'", $_GET[$Key] );
	$_GET[$Key] = str_replace("\\\"", "\"", $_GET[$Key] );
}

mb_language( "ja" );
mb_internal_encoding("UTF-8");

$ujis = mb_convert_encoding($_GET['value'], 'EUC-JP', 'UTF-8');

if ( $ujis == '送信' ) {
	$ujis = '送信を受信しました';
}

print $ujis;

?>
  



  PHP ( UTF-8 )

Charset が無ければ、utf-8 として扱われます。

以下のサーバーコードは必ず utf-8n で保存して下さい

PHP で utf-8 のソースコードは、必ず utf-8n で保存しないと、EFBBBF ( BOM ) というコードを先頭につける事になっているので、HTTP ヘッダを出力しようとすると、既にデータを出力済みと文句を言われます。

  
<?
header( "Content-Type: text/html; Charset=utf-8" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );

foreach( $_GET as $Key => $Value ) {
	$_GET[$Key] = str_replace("\\\\", "\\", $Value );
	$_GET[$Key] = str_replace("\\'", "'", $_GET[$Key] );
	$_GET[$Key] = str_replace("\\\"", "\"", $_GET[$Key] );
}

mb_language( "ja" );
mb_internal_encoding("UTF-8");

if ( $_GET['value'] == '送信' ) {
	$utf8 = '送信を受信しました';
}

print $utf8;

?>
  



  クライアントのキャラクタセットをサーバーに送る

以下のクライアントコードは、サーバー側の php で urlencode させてクライアントに戻すというものです。パラメータとしてクライアント側のキャラクタセットが必要になるので、Ajax クライアント の 基本コード に追加します

utf-8 の urlencode は、クライアント側の JavaScript のメソッド で充分目的が達せられると思いますが、こまかい変換仕様にこだわるならば、サーバー側を使用すると良いでしょう。
( PHP には、rawurlencode という RFC 1738 に基づきURLエンコードを行う関数もあります )

  
<HTML>
<HEAD>
<META http-equiv="content-type" content="text/html; charset=shift_jis">
<SCRIPT language="javascript" type="text/javascript">

	var dom,bIE;
	var objXMLHttp;
	var charSet;

	if ( document.all ) {
		charSet = document.charset;
		bIE = true;
		dom = new ActiveXObject("Msxml2.DOMDocument.3.0");
		objXMLHttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
	}
	else {
		charSet = document.characterSet;
		bIE = false;
		dom = document.implementation.createDocument("", "", null);
		objXMLHttp = new XMLHttpRequest();
	}


function GetUrlencode( ) {

	var result;
	var ndata = document.getElementsByName("indata")[0].value;
	ndata = encodeURIComponent(ndata);

	objXMLHttp.open(
		"GET",
		"urlencode.php?"
		 + "text=" + ndata
		 + "&charset=" + charSet
		, false );
	objXMLHttp.send( "" );
	result = objXMLHttp.responseText;

	document.getElementsByName("result")[0].value = result;

}

</SCRIPT>
</HEAD>
<BODY>

入力
<INPUT type=text name="indata" size="80">
<INPUT type=button name="send" value="送信" onClick='GetUrlencode( )'>
<br>
出力
<INPUT
	type="text"
	name="result"
	size="80"
	readonly
	 style='background-clor:silver'>
</br>

</BODY>
</HTML>
  

以下はサーバー側のコードです

  
<?
# **********************************************************
# PHP の urlencode をクライアントのキャラクタセット
# にあわせて変換して結果を返す
#
# ( このソースコードは、UTF-8N CR+LF です )
# **********************************************************
header( "Content-Type: text/xml; Charset=utf-8" );

mb_language( 'ja' );
mb_internal_encoding('UTF-8');

# PHP によって変換されてしまったコードを元に戻す
foreach( $_GET as $Key => $Value ) {
	$_GET[$Key] = str_replace("\\\\", "\\", $Value );
	$_GET[$Key] = str_replace("\\'", "'", $_GET[$Key] );
	$_GET[$Key] = str_replace("\\\"", "\"", $_GET[$Key] );
}

$text = 'charset が正しく指定されていません';

if ( strtoupper( $_GET['charset'] ) == 'SHIFT_JIS' ) {
	$ret = mb_convert_encoding(
		 $_GET['text'], "SHIFT_JIS", "UTF-8"
	);

	$text = urlencode( $ret );
}
if ( strtoupper( $_GET['charset'] ) == 'EUC-JP' ) {
	$ret = mb_convert_encoding(
		 $_GET['text'], "EUC-JP", "UTF-8"
	);

	$text = urlencode( $ret );
}
if ( strtoupper( $_GET['charset'] ) == 'UTF-8' ) {
	$text = urlencode( $_GET['text'] );
}

print $text;
?>
  



  Perl ( Shift_JIS )

日本語変換には、jcode.pl 互換の Jcode を使用しました。基本的には、PHP と同じで特記する事はありません

  
#!/usr/local/bin/perl

print "Content-Type: text/html; Charset=shift_jis\n";
print "\n";

use Jcode;

$QUERY_STRING = $ENV{'QUERY_STRING'};

@Fields_Data = split(/&/, $QUERY_STRING);

foreach $Field_Data ( @Fields_Data ) {
	($Name, $Value) = split(/=/, $Field_Data);
	$Value =~ tr/+/ /;
	$Value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	Jcode::convert(\$Value, 'sjis', 'utf8');
	$_GET{$Name} = $Value;
}

if ( $_GET{'value'} eq '送信' ) {
	$sjis = '送信を受信しました';
}

print $sjis;

  



  Perl ( EUC-JP )

  
#!/usr/local/bin/perl

print "Content-Type: text/html; Charset=euc-jp\n";
print "\n";

use Jcode;

$QUERY_STRING = $ENV{'QUERY_STRING'};

@Fields_Data = split(/&/, $QUERY_STRING);

foreach $Field_Data ( @Fields_Data ) {
	($Name, $Value) = split(/=/, $Field_Data);
	$Value =~ tr/+/ /;
	$Value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	Jcode::convert(\$Value, 'ujis', 'utf8');
	$_GET{$Name} = $Value;
}

if ( $_GET{'value'} eq '送信' ) {
	$ujis = '送信を受信しました';
}

print $ujis;

  



  Perl ( UTF-8 )

Jcode は必要無くなります。保存も utf-8n で保存したほうが良いでしょう。

私は、Perl はあまり得意ではありませんが、UTF-8 の扱いはいろいろ面倒です。しかし現在、一般的なサーバーではモジュール的には PHP より幅広く実装されている事が多いです。ですから、どうしても Perl を使わなければいけない場面が出てくるので、UTF-8 についてはある程度対処方法を知っておくと良いと思います。


  
#!/usr/local/bin/perl

print "Content-Type: text/html; Charset=utf-8\n";
print "\n";

$QUERY_STRING = $ENV{'QUERY_STRING'};

@Fields_Data = split(/&/, $QUERY_STRING);

foreach $Field_Data ( @Fields_Data ) {
	($Name, $Value) = split(/=/, $Field_Data);
	$Value =~ tr/+/ /;
	$Value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	$_GET{$Name} = $Value;
}

if ( $_GET{'value'} eq '送信' ) {
	$utf8 = '送信を受信しました';
}

print $utf8;

  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ