Ajax 日本語処理 ( ASP )

  通常のコードページで UTF-8 -> SHIFT_JIS



IIS 5以降では、コードページを指定する事によって、UTF-8 を処理する事が簡単になりましたが、あくまで、従来のコードページから UTF-8 の文字列を操作する方法を考えます。

※ コードページについての参考ページ

Microsoft へのリンク

※ 重要
Response.ContentType = "text/html" と Response.Charset= "shift_jis" は別々に設定してください。
Response.AddHeader( "Content-Type", "text/html; Charset=shift_jis" ) は使用しないで下さい。
Netscape 7.1 では、少なくとも問題が出ます ( ASP の都合 )

まず、クライアントから受けた「あ」という UTF-8 文字を表示してみます。
  
http://sv/aspTest/sjis.asp?value=%E3%81%82

<%
Response.ContentType = "text/html"
Response.Charset= "shift_jis"
Response.ExpiresAbsolute=#May 31,2000 23:59:59#

Response.Write Request.QueryString( "value" )

%>
  

上記結果では、「縺」と返されます。これは、E381 なので、まさにそのまま返された事が解ります。しかし、82 が取り去られているのは、QueryString( "value" ) で、SHIFT_JIS として不適格なせいです。ですから、%E3%81%82 の時点でバイナリとして処理する必要があります。

( ※ CAPICOM.Utilities については、こちら を参照して下さい )

  
<%
Response.ContentType = "text/html"
Response.Charset= "shift_jis"
Response.ExpiresAbsolute=#May 31,2000 23:59:59#

Set Stream = Server.CreateObject( "ADODB.Stream" )
Set CAPIUtil = Server.CreateObject( "CAPICOM.Utilities" )

Stream.Open
Stream.Position = 0
Stream.SetEOS
Stream.Charset = "utf-8"
Stream.Type = 1 ' バイナリ

aData = Split( Request.QueryString, "=" )
strChar =""
For I = 1 to Len( aData(1) )
	strChar = Mid( aData(1), I, 1 )
	if strChar = "%" then
		I = I + 1
		strChar = ChrB(CLng( "&H" & Mid( aData(1), I, 2 ) ))
		I = I + 1
	else
		strChar = ChrB(Asc(strChar))
	end if

	ByteArray = CAPIUtil.BinaryStringToByteArray( strChar )
	Stream.Write ByteArray

Next

Stream.Position = 0
Stream.Type = 2 ' テキスト
Response.Write Stream.ReadText()

Stream.Close 
%>
  


このままでは使えないので、すべての QueryString を SHIFT_JIS に変換し、ディクショナリオブジェクトにセットして使用します

  
<%
Response.ContentType = "text/html"
Response.Charset= "shift_jis"
Response.ExpiresAbsolute=#May 31,2000 23:59:59#

Set Stream = Server.CreateObject( "ADODB.Stream" )
Set CAPIUtil = Server.CreateObject( "CAPICOM.Utilities" )
Set MyData = Server.CreateObject("Scripting.Dictionary")

' **********************************************************
' UTF-8 入力文字列の変換
' **********************************************************
Function ConvertQueryString()

	Dim InData,nData,aData,I,strChar

	Stream.Open

	InData = Split( Request.QueryString, "&" )
	For nData = 0 to Ubound( InData )
		
		Stream.Position = 0
		Stream.SetEOS
		Stream.Charset = "utf-8"
		Stream.Type = 1 ' バイナリ

		aData = Split( InData(nData), "=" )
		strChar =""
		For I = 1 to Len( aData(1) )
			strChar = Mid( aData(1), I, 1 )
			if strChar = "%" then
				I = I + 1
				strChar = ChrB(CLng( "&H" & Mid( aData(1), I, 2 ) ))
				I = I + 1
			else
				strChar = ChrB(Asc(strChar))
			end if

			ByteArray = CAPIUtil.BinaryStringToByteArray( strChar )
			Stream.Write ByteArray

		Next

		Stream.Position = 0
		Stream.Type = 2 ' テキスト
		MyData( aData(0) ) = Stream.ReadText()

	Next

	Stream.Close 

End Function

Call ConvertQueryString()

' shift_jis で比較
if MyData("value") = "送信" then
	sjis = "送信を受信しました"
end if

Response.Write sjis

%>
  



  通常のコードページで UTF-8 -> EUC-JP



入力データは必ず UTF-8 なので、入力変換部分は同じになります。しかし、出力を EUC-JP にする為に変換関数が必要になります

また、EUC-JP は、デフォルトコードページからは、バイナリデータになるので、出力には Response.BinaryWrite を使用します。
( ※ Charset と実際のキャラクタセットを一致させるのを忘れないで下さい )

  
<%
Response.ContentType = "text/html"
Response.Charset= "euc-jp"
Response.ExpiresAbsolute=#May 31,2000 23:59:59#

Set Stream = Server.CreateObject( "ADODB.Stream" )
Set CAPIUtil = Server.CreateObject( "CAPICOM.Utilities" )
Set MyData = Server.CreateObject("Scripting.Dictionary")

' **********************************************************
' UTF-8 入力文字列の変換
' **********************************************************
Function ConvertQueryString()

	Dim InData,nData,aData,I,strChar

	Stream.Open

	InData = Split( Request.QueryString, "&" )
	For nData = 0 to Ubound( InData )
		
		Stream.Position = 0
		Stream.SetEOS
		Stream.Charset = "utf-8"
		Stream.Type = 1 ' バイナリ

		aData = Split( InData(nData), "=" )
		strChar =""
		For I = 1 to Len( aData(1) )
			strChar = Mid( aData(1), I, 1 )
			if strChar = "%" then
				I = I + 1
				strChar = ChrB(CLng( "&H" & Mid( aData(1), I, 2 ) ))
				I = I + 1
			else
				strChar = ChrB(Asc(strChar))
			end if

			ByteArray = CAPIUtil.BinaryStringToByteArray( strChar )
			Stream.Write ByteArray

		Next

		Stream.Position = 0
		Stream.Type = 2 ' テキスト
		MyData( aData(0) ) = Stream.ReadText()

	Next

	Stream.Close 

End Function

' ************************************************
' 内部コードを EUC-JP へ変換
' ************************************************
function ConvCharset( strValue )

	Stream.Open

	Stream.Position = 0
	Stream.SetEOS
	Stream.Type = 2	' テキスト
	Stream.Charset = "euc-jp"
	Stream.WriteText strValue
	Stream.Position = 0
	Stream.Type = 1 ' バイナリ
	ConvCharset = Stream.Read()

	Stream.Close 

end function

Call ConvertQueryString()

euc = ""
' shift_jis で比較
if MyData("value") = "送信" then
	euc  = ConvCharset( "送信を受信しました" )
end if

Response.BinaryWrite euc

%>
  



  通常のコードページで UTF-8 -> UTF-8

通常のコードページで UTF-8 -> EUC-JP に準じます



  EUC-JP (CODEPAGE=51932) で UTF-8 -> EUC-JP

  
<%
CODEPAGE=51932 
Response.ContentType = "text/html"
Response.Charset= "euc-jp"
Response.ExpiresAbsolute=#May 31,2000 23:59:59#

Set Stream = Server.CreateObject( "ADODB.Stream" )
Set CAPIUtil = Server.CreateObject( "CAPICOM.Utilities" )
Set MyData = Server.CreateObject("Scripting.Dictionary")

' **********************************************************
' UTF-8 入力文字列の変換
' **********************************************************
Function ConvertQueryString()

	Dim InData,nData,aData,I,strChar

	Stream.Open

	InData = Split( Request.QueryString, "&" )
	For nData = 0 to Ubound( InData )
		
		Stream.Position = 0
		Stream.SetEOS
		Stream.Charset = "utf-8"
		Stream.Type = 1 ' バイナリ

		aData = Split( InData(nData), "=" )
		strChar =""
		For I = 1 to Len( aData(1) )
			strChar = Mid( aData(1), I, 1 )
			if strChar = "%" then
				I = I + 1
				strChar = ChrB(CLng( "&H" & Mid( aData(1), I, 2 ) ))
				I = I + 1
			else
				strChar = ChrB(Asc(strChar))
			end if

			ByteArray = CAPIUtil.BinaryStringToByteArray( strChar )
			Stream.Write ByteArray

		Next

		Stream.Position = 0
		Stream.Type = 2 ' テキスト

		strChar = Stream.ReadText()
		Stream.Position = 0
		Stream.SetEOS
		Stream.Type = 2	' テキスト
		Stream.Charset = "euc-jp"
		Stream.WriteText strChar
		Stream.Position = 0
		Stream.Charset = "shift_jis"
		MyData( aData(0) ) = Stream.ReadText()

	Next

	Stream.Close 

End Function

Call ConvertQueryString()

ujis = ""
' ujis で比較
if MyData("value") = "送信" then
	ujis = "送信を受信しました"
end if

Response.Write ujis

%>
  



  UTF-8 (CODEPAGE=65001 ) で UTF-8 -> UTF-8

  
<%
CODEPAGE=65001 
Response.ContentType = "text/html"
Response.Charset= "utf-8"
Response.ExpiresAbsolute=#May 31,2000 23:59:59#

utf8 = ""
' utf-8 で比較
if Request.QueryString("value") = "送信" then
	utf8 = "送信を受信しました"
end if

Response.Write utf8

%>
  










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





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

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ