- ベストアンサー
ASPで多言語の表示がうまくできない!キャラクタセットの設定をチェックしよう
- ASPで開発中のウェブサイトで、日本語以外の言語の表示が「?」となってしまう問題に遭遇しました。
- ORACLEデータベースのキャラクタセットをAL32UTF8に設定しているにもかかわらず、日本語以外が正しく表示されない現象が発生しています。
- 他の言語も正しく表示するために、ASPコードにCODEPAGEを設定したり、Content-Typeを設定してみたりしましたが、解決できませんでした。ヒントやアドバイスをいただけると助かります。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
OracleインスタンスのキャラクタセットとNLS_LANGが等しい場合は、 文字コードの変換が行われないので、? が出ないとのことです。 一方、OracleインスタンスのキャラクタセットとNLS_LANGが異なる場合は、文字コードの変換が行われるため、組み合わせによっては、? が出てしまうみたいですね。 http://shodai.hp.infoseek.co.jp/oracle_global/oracle_global.html にある、「NLS_LANG とキャラクタセットの関係」の箇所を見てみてください。 なので、そういった意味で考えると、当初の「AL32UTF8」の設定は望ましいと言えると思います。 また関係ないかもしれませんが、WindowsとOracleで、Unicode変換を行う際、変換方法が異なると、文字化けや?が発生する恐れがあるみたいです。 これは試してみないとわからないのですが、 ・Oracleインスタンスのキャラセットは、AL32UTF8にする ・Oracleにアクセスするクライアント(今回だとWebサーバー) 上で、ファイル名を指定して実行で「regedit」を実行し、 レジストリ「HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEID\NLS_LANG」 を「JAPANESE_JAPAN.AL32UTF8」に変更してみるか、 もしくは、OSの環境変数にNLS_LANGの設定ができると思うので、 そちらで、JAPANESE_JAPAN.AL32UTF8 を設定してみる。 これでどうでしょうか? #Windows版 Oracle10.20 では、この設定が可能みたいなのですが、 10.0.2だと、ダメな可能性あり。 その場合は、65001 のCodePageを設定する必要があるかもしれません。詳細は、 http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19218-02/ch3globenv.htm#sthref184 を読んでみてください。 #また、既に、Oracleインスタンスは、AL32UTF8で作成しているのは間違いないですよね?そうなると後は、Oracleクライアント(今回のケースだとWebサーバー)のNLS_LANGをAL32UTF8にするわけですが、問題点としては、ASPアプリでは文字化けしなくなっても、今度はWebサーバー上でもし、SQL*Plusなどのクライアントツールをインストールしていて、Webサーバー上でSQL*Plusを使うことがある場合は、今度は、SQL*Plusが文字化けする可能性があります。 (SQL*Plusは、UTF8対応されていない模様。SQL*Plusが?が表示されるみたいです。) なので、もしかすると、UTF8に対応したOracle接続&操作ツールを別途用意しなきゃいけない等の弊害はあります。 詳しいことは、 http://otn.oracle.co.jp/forum/thread.jspa?threadID=35001863&tstart=540 で掲載されていましたので、ひと通り細かく読んでみてもらっても宜しいでしょうか? あまりお役に立てなくて申し訳ございませんが、もし上記でもまだ解決されない場合は、このASPスレではなく、Oracleのスレで再度質問してみると良いかもしれません。 あまりOracleは詳しくないので、お役に立てなくて申し訳ございませんでした。
その他の回答 (6)
- kero_mio
- ベストアンサー率90% (94/104)
一度、Oracleに保存されたデータをSELECTしてくるだけでは、 文字化けは解消しないと思います。 NLS_CHARACTERSETを変更&Nから始まる型(nvarchar, nchar)に変更したもので、UPDATEやINSERT文でデータを作成し、そのデータをSELECTしても、まだ文字化けしますか?
お礼
いつも、ありがとうございます。 NLS_CHARACTERSETの変更(UTF-8)は、既存のデータベースを修正せずに、新規にデータベース、ユーザー、テーブル(データ型はnvarchar2)を作成し、ACCESSでADO(Provider=OraOLEDB.Oracle)で接続し、INSERT文でデータを作成しております。 そのデータをORACLE Enterprise Managerで、データ表示をすると、中国語等で表示されていますが、ASPで表示すると、「?」となります。
- kero_mio
- ベストアンサー率90% (94/104)
ソースの送付ありがとうございました。 どうやら、Oracle側の問題だと断定しました。 下記のサイトにも同様の問題が掲載されています。 http://otn.oracle.co.jp/forum/thread.jspa?threadID=3004133 見てみると、中国語・日本語での混在時が問題のようです。 ちなみに文字が「?」になってしまうデータが格納されている テーブル列は、Nから始まる型ですか? 例:)nvarchar, nchar など もし、なっていないのであれば、テーブルの列定義を varchar, char ではなく、nvarchar, nchar に変更してみてください。 更に、OracleデータベースのNLS_CHARACTERSETは、AL32UTF8のキャラセットではなく、「UTF8」で設定してみると解決するかもしれません。 http://shodai.hp.infoseek.co.jp/oracle_global/oracle_global.html ASPのスレなので、Oracleやデータベースのスレで質問するともっと良い答えがもらえるかもしれないので、そちらでも合わせて確認してみることをお勧めします。
お礼
kero_mioさま、いつも迅速な回答ありがとうございます。 1.データベースのデータ型をNVARCHAR2 2.新たにデータベースをNLS_CHARACTERSETをUTF8に設定し、データベースのデータ型をNVARCHAR2に設定 上記、2通りを試みてみましたが、表示は前回と同じ「?」でした。 ちなみにaccessでADO(Provider=OraOLEDB.Oracle)で接続した場合は、フォームに表示されてきます。 ASPの書き方には、問題ないようなので、他に原因があるのですね。 本当にいつも丁寧な回答ありがとうございます。
- kero_mio
- ベストアンサー率90% (94/104)
それから、できれば、ASPからOracleに接続しに行く時、どのような接続方法で接続していますか? 接続文字列またはASPで定義しているソースの一部公開して頂ければ、何かわかるかもしれません。 oo4o の接続方法だとUTF-8は問題があるようなことが掲載されていたのを見つけたので気になった次第です。 宜しくお願いします。
お礼
Global.asaとOO4ODEMO.aspでやっていましたが、もっと単純に以下のようにしました。 --test.asp-- <% @language=VBScript codepage=65001 %> <% Response.ContentType = "text/html" Response.Charset= "utf-8" Session.CodePage=65001 %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>test</title> </head> <body> <% Private OraSession Private oraDB Private OraDynaset Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set oraDB = OraSession.DbOpenDatabase("test", "test_user/test", clng(&H3)) Set OraDynaset = oraDB.DbCreateDynaset("SELECT * FROM testtable", CLng(&H4)) Do Until OraDynaset.EOF = True Response.Write OraDynaset("naiyo").value & "<br>" OraDynaset.MoveNext Loop OraDynaset.Close %> </body> </html> よろしくお願いします。
- kero_mio
- ベストアンサー率90% (94/104)
>上記のように、追加して見ましたが、駄目でした。 ダメだったというのは、どのようにダメだったのでしょうか? 何か他のエラーが出たとか状況が変わらなかったなど・・・ また、教授したコードはしつこいようですが、UTF-8でソース保存されてますよね? もし私が教授したコードがダメとなると、Oracle側のエンコード設定も 見なおした方がよさそうです。 恐らく、ASP側は、私が教授したコードで完全にUTF-8対応されているはずですので・・・ Oracle側のエンコード設定がどのようになっているか、データベース管理者に確認してみることをお勧めします。 また、ご自身がデータベース管理者であれば、ここではなく、Oracleやデーターベースのコーナーで質問すると何か返答がもらえるかもしれませんので、Oracle・データベースの質問カテゴリで質問して頂けると幸いです。 宜しくお願いします。
- kero_mio
- ベストアンサー率90% (94/104)
補足ありがとうございます。 後は、ASP側の設定ぽいですね。 <%@ CODEPAGE=65001 %> もしかしたら下記が必要かもしれません。 試して頂いても宜しいですか? <% @language=VBScript codepage=65001 %> <% Response.ContentType = "text/html" Response.Charset= "utf-8" ' Oracle のデータをSessionに格納しているのであれば! Session.CodePage=65001 %> <html> <head> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"> </head> <body> ..... </body> </html>
お礼
ありがとうございます。 上記のように、追加して見ましたが、駄目でした。
- kero_mio
- ベストアンサー率90% (94/104)
確認になりますが、その問題のASPのソースファイルもUTF-8で保存していますか? 秀丸やさくらエディタ、Viviなど、UTF-8に対応したエディタでASPファイルを開き、もし他の文字コードでASPファイルが保存されているようであれば、UTF-8でASPソースファイルを保存しなおして、再度問題のASPを実行してみてください。 それでも駄目なら、他の原因が考えられますので、またこのスレにご連絡ください。宜しくお願いします。
お礼
早速ありがとうございます。 OO4ODEMO.ASPの方は、 <head> の下に、 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">を追加し、秀丸で、ファイル-エンコードの種類をUNICODE(UTF-8)にして、内容を維持したまま変換し、保存しております。
お礼
OSの環境変数にNLS_LANGの設定をしたら、表示されてきました! 本当にありがとうございます。 sql*plusの方は、文字化けしていますが、とりあえずデータ確認の方は、Oracle Enterprise managerの方で出来ますので、こちらの方は後で確認いたします。 いつも、迅速で適切な回答をありがとうございました。 最後に、Oracleのバージョンは10.2.0でした。間違えて入力しておりました。申し訳ございませんでした。