QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

Oracle「〜」文字が化ける現象

[テスト環境]
----------------------------------------
WindowsXP(SP1、SP2)、.NET2003 C#(Winアプリ)、
Oracle9.2.0.1.0、FrameWork1.1(SP有り、SP無し)
----------------------------------------

いつもお世話になっております。

Oracleからのデータ取得で「〜」文字が化ける現象で
教えていただきたいことがあります。

次の手順でテストを行いました。

--------------------------------------------------

  1. Oracle9.2サーバを構築   この時のキャラクタセットはデフォルト(JA16SJIS) --------------------------------------------------
  2. 別マシンにOracle9.2クライアントをインストール   この時、レジストリのNLS_LANGをJA16SJISTILDEに変更。 --------------------------------------------------
  3. テストテーブルを作成し、「〜」文字データを入力 --------------------------------------------------
  4. SQLPlusからこのデータを取得し確認、正常に「〜」文字が   表示されました。 --------------------------------------------------
  5. Common SQL Environmentから接続し、データを表示。   正常に表示されることを確認しました。 --------------------------------------------------
  6. VB6.0(SP5)でMicrosoft ActiveX Data Objects 2.7 Libraryを   参照設定し、Oracleサーバへ接続+データ取得を行い   正常に「〜」が表示されることを確認しました。 -------------------------------------------------- ※ 5、6は文字コードが[0x81 0x60]であることも確認しました。 --------------------------------------------------
  7. .NET2003 C#からテストアプリを作成し、    OleDB、OlacleClient両方でDBへの接続テストデータの取得を行い、    取得出来た文字を確認したところ   「〜」→「?」となりました。この時の文字コードは「0x3F」です。 --------------------------------------------------
  8. Oracleサーバの再構築を行い、DBのキャラクタセットを   JA16SJISTILDEに変更し、再度(7)を確認したところ   正常に「〜」文字が取得出来ました。 --------------------------------------------------

何故、.NETの場合だけ7.で正常にデータを取得することが
出来ないのでしょうか?
現状、システムは稼動しており、簡単にサーバ側の再構築を
行うことが出来ない状況です。
クライアント側だけで何かしらの対処方法があるのでしょうか?

ネット検索等で色々調べておりますが、全く分からない状態です。
皆様からのお知恵をお借り出来ればと思っております。

ご教授宜しくお願い致します。

質問者:mm

回答

推測ですが、Unicodeがらみの問題かと。

つまり、「〜」(波線)をUnicodeに変換する際(または戻す際)、
Unicode側の「FULLWIDTH TILDE」に変換されるか、「WAVE DASH」に変換
されるかということではないかと。(.net C#では「WAVE DASH」に変換されて
しまっている?見た目は同じ文字なので...)

規格の問題と言えばそれまでですが、IBM拡張文字とかと同様、現在の環境であれば、
表示に問題がある側のアプリで変換をかけるか、使用しないようにするかしかないの
でしょうかね。

投稿者:Beatle

編集 履歴 (0)

>Beatleさん

早々のお返事ありがとうございます。
Unicode変換のお話ですが、Oracleサーバ側のキャラクタセットを
クライアント側と合わせた場合(JA16SJISTILDE)、
正常に「〜」文字が取得出来るというのは、.net側で
「〜」をFULLWIDTH TILDEに変換されるようになるという
ことでしょうか?(キャラクタセットを合わせないと、
WAVE DASHに変換されてしまう?)


よく理解出来て居らず、変な質問をしているかもしれません。
.netでのUnicode文字について調べてみます。

投稿者:mm

編集 履歴 (0)

マミさんの書き込み (2004-10-21 10:37) より:

Unicode変換のお話ですが、Oracleサーバ側のキャラクタセットを

クライアント側と合わせた場合(JA16SJISTILDE)、

正常に「〜」文字が取得出来るというのは、.net側で

「〜」をFULLWIDTH TILDEに変換されるようになるという

ことでしょうか?(キャラクタセットを合わせないと、

WAVE DASHに変換されてしまう?)

.net側と書きましたが、正確にはどこで誤変換しているのか調べないと
私にはわかりません。ただ、DB側とクライアント側のキャラクタセットを異なるものにした場合
にのみ発生するのであれば、.net側じゃないかも...キャラクタセット
は合わせるのが基本ですから...

投稿者:Beatle

編集 履歴 (0)

マミさん、こんにちは。

この辺↓の話が参考になるかも知れません。
Top > @IT会議室 > Insider.NET 会議室 > 文字化け(WAVE DASH 問題)について
Top > @IT会議室 > Insider.NET 会議室 > 文字コードの変更

投稿者:きくちゃん

編集 履歴 (0)

>Beatleさん

お返事ありがとうございます。
ご指摘の通り、DBのキャラクタセットについて
サーバ側、クライアント側の設定を一致させるのが
基本だと思います。今回はサーバ側の設定を変えるのが
難しい為、次回構築時は意識合わせを行おうと思います。
ご教授ありがとうございました。

>きくちゃんさん

お返事ありがとうございます。
教えていただいたリンク先の記事を読みました。
コード変換での障害、勉強になりました。
今回はReplaceをかけて対応する方向で
考えたいと思います。ありがとうございました。

投稿者:mm

編集 履歴 (0)

 台風で接続できない間に終わっているのかもしれませんが。

 サーバとクライアントでキャラクタセットをあわせて(クライアント側は変更できますよね?)、MS製のドライバを使えば、MS製のドライバが変換してくれるはずですけど?


投稿者:Jitta

編集 履歴 (0)

>Jittaさん

お返事ありがとうございます。

投稿した質問内容が悪かったかもしれません。

取得したデータをラベルやメッセージボックス等で
表示する分には「〜」が表示されます。
------------------------------------------
#ただ、見た目が違いますが・・。
 ご指摘内容は、この事だと思ったのですが、
 間違っていればご指摘お願い致します。
------------------------------------------
DataReaderから取得したデータをファイルに落とし、
ファイルの内容を画面表示した場合は「?」と表示されます。
DataReaderから戻ってきた値を確認すると、見た目は
「〜」なのですが、文字コードが「0x3F」となっています。

間違い等ありましたらご指摘・ご教授お願い致します。

投稿者:mm

編集 履歴 (0)

マミさんの書き込み (2004-10-23 14:43) より:

取得したデータをラベルやメッセージボックス等で

表示する分には「〜」が表示されます。


#ただ、見た目が違いますが・・。

 ご指摘内容は、この事だと思ったのですが、

 間違っていればご指摘お願い致します。


DataReaderから取得したデータをファイルに落とし、

ファイルの内容を画面表示した場合は「?」と表示されます。

DataReaderから戻ってきた値を確認すると、見た目は

「〜」なのですが、文字コードが「0x3F」となっています。

 OleDbConnectionに指定する、データプロバイダを、Oracleのものにせず、Microsoftのものにすれば、データプロバイダ内でWave-DashをFull-width Tildeに変換します。「波ダッシュ」が『ただ、見た目が違いますが』で、「全角チルド」が『〜』です。
 で、波ダッシュには該当するShift-JISコードがないので、「?」になります。

#組み合わせによる変化は、以前ここかOTNに投稿したような???


投稿者:Jitta

編集 履歴 (0)

>Jittaさん

お返事ありがとうございます。

やっと意味が理解出来ました。
(皆さんからの貴重なアドバイスを
間違って理解しておりました)
きくちゃんさんから頂いたリンク先の記事を
再度読み返しました。

その投稿では最終的には自力で文字を置き換える
という事で解決されていましたので、そちらの方にばかり
気を取られていました。

リンク先の中でもJittaさんはMSDAORAでの確認は
どうですか?という内容を投稿されておられました。

データプロバイダはOracleの物を使用していましたので
MS製に変えました(MSDAORA)。結果、正常に「〜」を
取得することが出来ました。

Beatleさん、きくちゃんさん、Jittaさん本当にありがとうございました。

*****************************************************************
#きくちゃんさんから頂いた有益な情報をモノに出来ずごめんなさい。
 また宜しくお願い致します。
*****************************************************************

投稿者:mm

編集 履歴 (0)
ウォッチ

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