1 Reply Latest reply: Dec 25, 2012 3:34 AM by nashiOracle RSS

    10g ODBC接続 での文字化け対策

    981379
      ●構成
      ・DBサーバ
       WindowsXP(試験環境のため)
       Oracle 10g (Release2)
       データベースキャラクタセット:utf-8

      ・クライアント
       Windows7
       Visual studio 2010 C#.Net(.NetFramework 3.5)
       NLS_LANG = utf-8
       Oracle ODBC ドライバ接続

      ●事象
      このような環境だと、C#アプリ側で画面表示する全角文字が文字化けしますが
      これはWindows環境で、NLS_LANG = utf-8にしていることが起因します。

      文字変換のロジックを追加していますが、下記問題があり、ご相談する次第です。

      ●経緯
      当初、クライアントのNLS_LANG は、s-jis にしていました。
      この時には文字化けの問題はありませんでした。

      しかし、クライアントのNLS_LANGがutf-8でなければ文字化けする
      他のクライアント製品と同じPC上で動作させなければならなくなりました。
      このため、改造のできるC#アプリ側で文字化け対策を行うことにしました。

      ●対策
      C#アプリ内で データベースの全角文字が utf-8 で来るようになったため
      文字化けが発生するようになったのですが、このutf-8 データをutf-16に
      変換することはできました。

      ●問題事象
      ところが、カラムから取り出せる文字列が途中で切られてしまう現象が起こっています。

      例えば
      varchar(2) で定義しているカラムに "あい" と入っているとします。
      C#アプリ内で、変換のため、System.Data.Odbc.OdbcDataReader.GetBytes()メソッドで
      バイト単位で値を取り出すと 4バイトしか取り出せませんでした。
      変換しても結果的に "あ・" という形になってしまいます。

      utf-8であれば2文字( 6バイト)取り出して欲しいところなのですが。。。
      utf-16での2文字分( 4バイト)しか取り出してもらえません。

      ●お聞きしたいこと
      ①本事象の根本原因について、情報をお持ちであればご提供願えませんでしょうか。

      ②ODBCドライバ設定など、環境設定の不備である可能性もあります。
       見直すべきポイント、プロパティなどアドバイスがございましたら、お願いします。

      ③Microsoft製品については本フォーラムでは、議論すべきではありませんが
       VisualStudioのビルド構成などの可能性もあります。
       もし関連URLの情報など、お持ちでしたら、教えてください。

      よろしくお願い致します。
        • 1. Re: 10g ODBC接続 での文字化け対策
          nashiOracle
          直接の回答でなく恐縮ですが、何かの参考になれば。
          ご提示の構成で、「NLS_LANGをS-JISにしないと文字化けする」理由がよく判らないのですが、NLS_LANGに起因する文字化けには悩まされ、調査したことがあります。

          (1) NLS_LANG FAQ
          http://otndnld.oracle.co.jp/tech/globalization/htdocs/nls_lang%20faq.htm

          (2) 当時検討した対策案の1つ(却下された)ですが、
          アプリケーションの起動に先立って
          SET NLS_LANG=JAPANESE_JAPAN.JA16SJIS
          を実行する。端末のNLS_LANGは現状通りuft-8のまま。

          (3) C#ならば、
          http://uchukamen.com/Programming/Environment/index.htm
          を参考に自プロセス内のNLS_LANG環境変数を変更する。

          とか。