C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: ADOで取得した結果の文字化け


(過去ログ 89 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■53267 / inTopicNo.1)  ADOで取得した結果の文字化け
  
□投稿者/ やじゅ (1719回)-(2010/09/09(Thu) 00:36:41)
やじゅ さんの Web サイト

分類:[レガシ ASP] 

現在、ADOを使用してORACLEを接続しています。
ORACLEのテーブルにUTF-8形式で中国語の簡易体でメッセージがセットされています。
起きている現象としては、ADOのフィールドの値をResponse.Writeで日本語の「系統」
の中国語の簡易体「系&#32479;」を表示した場合「系?」と?で表示されてしまいます。
フィールドの値を使わず直接文字列でセットした場合には正常に表示されます。
「系&#32479;」UTF-8のバイト列 E7 B3 BB E7 BB 9F

下記サイトを参考にADOから返されるデータの値を16進値で表示しようとしたのですが
VBScriptでは、型宣言がないためByte配列が使えません。
下段のサイトのバイト配列操作で16進表示できるかと思ったのですが力不足で方法が
分かりませんでした。

ADOで取得した結果が文字化けする
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200506/05060016.txt
バイト配列操作
http://winscript.s41.xrea.com/wiki/index.php?%5B%5B%A5%C6%A5%AF%A5%CB%A5%C3%A5%AF%5D%5D#content_1_12

16進表示で見たいのは返されるデータを見ようと思ったためであり、最終目的としては
中国語の簡易体で文字化けせずに表示できるようにしたいですが、今後の技術情報として
下記2点について、ご教示お願いします。
1.ADOから返されるデータの値を16進値として表示
2.「系&#32479;」を文字化けせずに表示

環境:IIS6.0 WindowsXP Oracle10g レガシーASP

よろしくお願いします。
引用返信 編集キー/
■53270 / inTopicNo.2)  Re[1]: ADOで取得した結果の文字化け
□投稿者/ 魔界の仮面弁士 (1798回)-(2010/09/09(Thu) 09:41:46)
No53267 (やじゅ さん) に返信
> 起きている現象としては、ADOのフィールドの値をResponse.Writeで日本語の「系統」
> の中国語の簡易体「系&#32479;」を表示した場合「系?」と?で表示されてしまいます。
> フィールドの値を使わず直接文字列でセットした場合には正常に表示されます。

Oracle / ADO / ASP(IIS) / HTML のいずれの問題なのかを
切り分ける必要がありそうです。

まずはデータベースから離れて、ASP 自体の確認から。

後述の 2 つのコードはどちらも同じ処理ですが、
前者は UTF-8、後者は Shift_JIS です。

青文字が正しく表示される部分で、
赤文字は正しく出力されない部分です。ここまでは大丈夫でしょうか?


***** asp を UTF-8 ファイルで保存していた場合 *****

<%@CodePage="65001"%><% Option Explicit
Session.CodePage = 65001
Response.ContentType = "text/html"
Response.Charset = "UTF-8"
Dim S
S = "系" & ChrW(32479)
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja-JP">
<head>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
<title>UTF-8バージョン(DOM付きASP)</title>
</head>
<body style="font-size:xx-large">
<p style="color:orange"><%= S %></p>
<p style="color:blue"><%= Server.HtmlEncode(S) %></p>
</body>
</html>


***** asp を Shift_JIS ファイルで保存していた場合 *****

<%@CodePage="932"%><% Option Explicit
Session.CodePage = 932
Response.ContentType = "text/html"
Response.Charset = "Shift_JIS"
Dim S
S = "系" & ChrW(32479)
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja-JP">
<head>
<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">
<title>Shift_JISバージョン</title>
</head>
<body style="font-size:xx-large">
<p style="color:red"><%= S %></p>
<p style="color:blue"><%= Server.HtmlEncode(S) %></p>
</body>
</html>
引用返信 編集キー/
■53277 / inTopicNo.3)  Re[1]: ADOで取得した結果の文字化け
□投稿者/ 魔界の仮面弁士 (1801回)-(2010/09/09(Thu) 10:23:18)
No53267 (やじゅ さん) に返信
> 1.ADOから返されるデータの値を16進値として表示

UTF-16 としての取得で良いなら、AscW 関数で充分です。
今回の場合、下記のようにすれば『7CFB7EDF』が得られるはず。
(VBS の文字列は、内部的には UTF-16 のバイナリで管理されています)

<p><% 
Dim i, c
For i = 1 To Len(S)
  c = AscW(Mid(S, i, 1))
  If c <= 0 And c <= &HFF Then
    Response.Write Right("00" & Hex(c), 2)
  Else
    Response.Write Right("0000" & Hex(c), 4)
  End If
Next
%></p>


なお、ASP から出力された HTML がどのようにブラウザーに表示されるかは、
(1) HTTP 応答ヘッダー Content-Type
(2) <meta http-equiv="Content-type" content="〜">のタグ
(3) 実際にサーバーから送出されたバイナリー
に依存します。
特に問題になるのは (3)の部分ですが、これは下記のようになっています。

・Response.Write およびその略記である <%= %> で出力される文字列は、
 Session.CodePage の影響を受ける。

・<%〜%> の外に直接書いた文字列(HTML タグ等)は、
 ASP ファイル自体の文字コードで出力される。

・<% S = "テスト" %> といった VBScript の文字列リテラルは、
 ASP の @CodePage ディレクティブの影響を受ける。

・Server.HtmlEncode を使うと、文字列が適切な内容に変換される。
 変換結果は数値文字参照や文字実体参照に置き換わることがあるが、
 そうした文字参照への変換が伴うかどうかは、上記の設定に依存する。


なお、Oracle 側が UTF-8 (というか AL32UTF8) であろうとそれ以外だろうと、
ADO 経由で得られる「文字列」は UTF-8 で符号化されたものでは無く、
UTF-16 相当で符号化されたデータとなるはずです――設定さえ正しければ。

# もしも生のバイナリを得たいなら、GetChunk などでバイナリとして
# 得る事になりますが、それを VBScript でとりまわすのは厄介かも。

引用返信 編集キー/
■53292 / inTopicNo.4)  Re[2]: ADOで取得した結果の文字化け
□投稿者/ やじゅ (1721回)-(2010/09/09(Thu) 18:26:31)
やじゅ さんの Web サイト
No53277 (魔界の仮面弁士 さん) に返信
> なお、Oracle 側が UTF-8 (というか AL32UTF8) であろうとそれ以外だろうと、
> ADO 経由で得られる「文字列」は UTF-8 で符号化されたものでは無く、
> UTF-16 相当で符号化されたデータとなるはずです――設定さえ正しければ。

回答ありがとうございます。

原因が分かり、解決いたしました。
「MS製Oracle ODBC Driver」から「Oracle製のODBC Driver」に切り替えたところ
文字化けしなくなりました。

そういえば、環境に肝心なミドルウェアのを書いてませんでした、というか気が付かなかったです。
ADO 経由の時点で文字コードが変換されているわけですね。

もう少し自分なりに技術的な部分で納得した上で解決済みにしようと思います。
引用返信 編集キー/
■53295 / inTopicNo.5)  Re[3]: ADOで取得した結果の文字化け
□投稿者/ 魔界の仮面弁士 (1803回)-(2010/09/09(Thu) 18:37:27)
No53292 (やじゅ さん) に返信
> ADO 経由の時点で文字コードが変換されているわけですね。

文字コード変換が行われたのは、ADO や OLEDB の層ではなく、
ODBC (あるいはより下位のレイヤー)かも。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -