QA@IT

oracle(UTF-8)にado接続した際に文字化けしない理由

5548 PV

vbsで
adodb.conncection
provider=OraOLEDB.Oracle
を利用しoracle(UTF-8)に接続し

接続結果をWScript.Echoで標準出力したところ、UTF-8なので日本語は文字化けするのか
と思いましたが、文字化けしませんでした。

何故文字化けしないのでしょうか?

  • コメント追記しました。 -

回答

VBScriptはUTF-8の状態でOracleのデータを触っておらず、内部でUnicode文字列として操作しています。
ADOでデータを取り出す際にUnicodeに変換されたものを受け取っています。
(VBScript内ではOracleのデータ、ADOに限らずたとえば変数に代入した文字列も内部ではUnicodeとして扱われています。)

正しくUnicodeに変換されていてくれれば普通の変数に入っている文字と同じように扱えますので文字化けが起きません。


詳しくは内部文字コードの話になってきます。
まとまっているページは残念ながら見つけられませんでしたが、

http://www.atmarkit.co.jp/fwin2k/win2ktips/395codeconv/codeconv.html

現在のWindows OSでは、内部的にはUnicodeを使って処理を行っている。

http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89

Microsoft Windows や Mac OS X などの最近の OS は、表面上は Unicode 以外の文字コードを使っていても内部処理上は Unicode に変換して処理しているものが多い。

といった話が背景にあるという事です。


追記

本題とは関係ないですがコマンドプロンプトはShiftJISしか出力できないわけではありません(日本語環境のデフォルトはそうですが)。
cmd.exe(コマンドプロンプト)でutf8のテキストを表示

utf8のテキストファイル(utf8.txtとします)を用意します。
cmd.exeを起動しタイトルバーを右クリックして、プロパティを開きフォントを ラスタフォントから MS ゴシックにしてOK。
コマンドプロンプトを閉じ、もう一度開きます。(プロパティでフォントがMS ゴシックであることを確認)
以下のコマンドを実行します

chcp 65001
type utf8.txt
chcp 932

うまくいかない場合は以下の様にしてみてください

chcp 65001
cmd /c type utf8.txt
chcp 932

コマンドプロンプトで表示できる文字はコードページに左右されます。

編集 履歴 (1)
  • ご回答ありがとうございます。

    ためしにUTF-8で保存したテキストファイルを
    FileSystemObjectを利用しWScript.echoで出力したところ、
    文字化けしましたが、これは内部的な変換がうまくいっていないということでしょうか?
    -
  • その通りです、ネットで検索すると「FileSystemObjectでUTF8ファイルを開くには」のような質問もあがってたりしますが、FileSystemObjectは文字コードを指定して開く機能がないため、ファイルは(日本なら)SJISと仮定して開いてしまいます。ここでUnicodeへの変換に失敗します。 -
  • 内部的にUnicodeとのことで納得できたつもりだったのですが、そもそもコマンドプロンプトはShift_jisしか扱えないと思います。
    unicodeの日本語テキストファイルをshift_jisで開きなおすと文字化けすることを考えると、変数に代入した内部的にUnicodeの文字列をechoで出力した場合は文字化けするのではないでしょうか?
    -
  • いえ、出力時も内部文字コードに従って逆に変換されています。
    厳密にどのタイミングでというのははっきりとは言えないといいますか、だれが(どのプログラムが)出すかなど絡んできます。

    なお、コマンドプロンプトはShiftJISしか扱えないわけではありません。chcpでコードページを変えることができます。日本では932になっていますがほかの国では違うコードページになっています。
    -
  • 余談を追記しました。 -
  • 返信が遅くなりすみません。追記をありがとうございます。出力時にも逆変換しているわけですね、ご回答をありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。