@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

文字が変わる?

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-02-06 16:43
 Oracle9iR2からデータを取り出すWebServiceを作成しています。今まで気がつかなかったのですが、“〜”(全角で、SHIFTを押しながらひらがなの「へ」のキー)の文字が変わってしまうのです。

 どのように変わるかというと、この文字は左側は下から始まっているのですが、上から始まる文字に変わるのです。ちょうど、上下対象になります。

 WebMethodの戻り値としてDataSetを使用しています。データベース中の文字列を覗くと“〜”で入っているのですが、WebMethodから返される文字列(DataSetのテーブルの行のデータ)は逆さまになっています。見た目はわかりにくいのですが、“〜”としての情報は欠落しており、「?」(半角クエスチョンマーク)になってしまいます。


 どなたか同じような現象について情報をお持ちではないでしょうか。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-02-06 18:07
 いろいろ試してみると、文字コードあたりの問題だとわかってきました。Oracleの文字コードセットをS-JIS(Windowsでのデフォルト)にしているのですが、データベース中のS-JISコードを.NETのUNICODEに取り出したときに、今試したところでは「〜」だけ、文字コードが変わってしまうみたいです。ただし、これをデータベースに戻したときにはS-JISの「〜」で入っています。

 問題はS-JIS環境にそのまま持っていったときで、IE、Excelともに上下逆さの文字が表示されます。これをテキスト形式で保存し、UNICODE対応でないモノ、もしくはS-JISコードで読み込むと、「?」になります。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-02-07 08:54
 Borland C++ Builder 6 を引っ張り出してきて試してみました。.NETではOracle ODBC Providerを使用しているので、ODBCに問題があればBCB6でも「〜」が変になることになります。結果、BCB6で作成したアプリでは「〜」が「〜」のままで引っ張ってこられるので、.NET内での文字コードUTF-8への変換でミスっている、と判断します。

 しかし、S-JISファイルから読み込むときには明示的にエンコーダを指定しなければならないのに、データベースから持ってくるときは指定しません…?そういえば、.NETのソース内に記述した文字はUTF-8なので、そのままデータベースに送ると解読不能のはず…?なのにDBSにはデーコードされた?SQL文字列がわたっているのはどういうこと?UTF-8の「〜」はS-JISに変換できているのに、S-JISから変換できない?けれども、.NETのエディタ上でコピーした「〜」をS-JISのテキストエディタ上へペーストするとS-JISの「〜」になる。まぁ、この変換はWindowsがしているんだろうけど。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-02-07 11:47
解決しました。

 データプロバイダにOracle提供のモノを使っているのが原因でした。MS ODBC for Oracleを使うと、「〜」は「〜」のままで取り出せました。
 「MS ODBC for Oracleは、Oracle ODBC Driverがないと動かないから、Oracle ODBC Driverを直接呼んでやろう」と思ったのですが、MS ODBCが文字コードの変換を行っているのでしょう。

 ちなみに、Oracle Data Provider for .NETでも、同じ問題が発生しました。MSのモノは試していませんが、OKなのかなぁ?
BBC
常連さん
会議室デビュー日: 2002/03/15
投稿数: 37
お住まい・勤務地: 東京
投稿日時: 2003-02-07 14:17
こんにちは。

Javaの話で恐縮ですが、ShiftJISは
「WindowsのSJIS(MS932)」と
「MacのSJIS(SJIS)」 →拡張無しのShiftJISかもしれません
の2つが存在します。

独自拡張部分が存在するのがそもそもの始まりなのですが、Windowsの拡張部分には、
一般的に良く知られている「丸付き1」等の他に、「〜」も存在しています。

恐らく、OracleのSJISは標準的なShiftJISなのでは?と推測しますが、どうでしょうか?
(で、.NET上でのShiftJISはMS932であると)

私はJavaでエディタを作っていて、この問題に突き当たりました。
利用先環境の標準はMS932のようなので、そちらで処理しようかと考えていますが・・・。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-02-07 16:19
情報ありがとうございます。OTNのページに情報がありました。

 結論から言うと、BBCさんの推測通り、MSの「拡張」部分に問題があります(ご参考)。こういう「便利だろ」といって“勝手に”拡張する=押しつけるところが叩かれているのに、どうしてMSという会社はその体質を改めようとしないんでしょうねぇ・・・

 まぁ、MSがこうして情報を公開しているんだから、Oracle側も「JISで規定されているから」といって杓子定規に作るのではなく、MSの身勝手にあわせてこそ、「Windows用」といえるんじゃないかとも思いますが。


#丸数字はMSではなく、Just Systemではないかと思っています。
#Windows3.1のころは使えませんでしたから。

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-02-07 16:23 ]
じょび
会議室デビュー日: 2002/05/04
投稿数: 9
投稿日時: 2003-02-10 11:04
> ちなみに、Oracle Data Provider for .NETでも、同じ問題が発生しました。MSのモノは試していませんが、OKなのかなぁ?

私が確認した限りでは、Microsoft ODBC Driver for Oracle、および Microsoft OLE DB Provider for Oracle(MSDAORA)を使用する場合はこの現象は発生しませんが、Microsoft .NET Managed Provider for Oracle (http://www.microsoft.com/downloads/release.asp?releaseid=41248で提供されているもの)を使用した場合は同じ現象が発生します。

moge
会議室デビュー日: 2003/01/08
投稿数: 2
投稿日時: 2003-03-05 18:45
サーバ側もしくはクライアント側のOracleのパラメータで
NLS_LANG=JAPANESE_JAPAN.JA16SJISTILDE
を使用されてもだめでしょうか?

スキルアップ/キャリアアップ(JOB@IT)