2012年8月30日木曜日

QGis Python Plugin と日本語の周辺3

 前回、UTF8で保存したバッチファイルを実行すればOKです。なんて書きましたが、問題がありました。 ウィンドウズのコマンドプロンプトが、コマンドラインの一部の文字コードの値を変更してしまうのです。そのため、使う文字コードによっては、まともに動作しません。  とりあえず、判明したのは「先」という漢字です。バイナリで表現すると、0xE5,0x85,0x88 の組みになります。もしかしたら、ANSI.SYS とかが組み込まれてて悪さしてるのかな?というのが頭を過ぎったのですが、Windows7 あたりでは、config.nt ファイルや、autoexec.nt ファイルなんて、ありませんでした。  コマンドプロンプトで chcp 65001(=UTF8) とか指定できますが、コンソールを通過すると文字化けするので、現時点では、まともに動作しません。よって、コマンドラインから入力される文字列は、MBCS (日本の場合 CP932=SJIS=ShiftJIS)に限定され、選択肢はありません。ウィンドウズだけのために、UNICODE文字セットを標準としてコンパイルするのは、問題があると思いますので、最小限の対処法は、入力値を MBCS から UTF8 に変換してやる事になります。  では、これを国際的に実装しようと思ったら、MultiByteToWideChar API を使って CPACP (= CP0) から、UNICODE に変換し、WideCharToMultiByte で UTF8 (=CP65001) にする以外に方法がありません。そうです、CPLWin32Recode 関数に "CP0" , "CP65001" という変換を促してやればいいのです。リポジトリに取り込まれたコードでは、CP0 は使わないだろうと思って、入力条件として コードページ > 0 としてしまったので、この条件を >= 0 とするよりありません。後、内部でUNICODEに相互変換する関数の実装があるのですが、変に複雑なんでウィンドウズの場合は MultiByteToWideChar と WideCharToMultiByte の関数に置き換えてあげた方が良いと考えてます。これらの変更を加えた上で、ogr2ogr 等の全てのコマンドプログラムに対して、コマンドの引数の文字コード変換を行うコードを挿入する必要があります。CPLArgumentConvert とかいう関数を設置してあげて、コーディング・ガイドラインを提示してあげた方が良いのかもしれません。という辺りを GDAL/OGR Develpment ML に投げてみようかと考えてます。 追記:GDAL_FILENAME_IS_UTF8 というのは、ウィンドウズの場合必須になります。ここを NO に設定すると、英語圏以外の文字コードは動作しません。  

0 件のコメント: