2008/12/27(土) [n年前の日記]
#2 [iappli][prog] cl.exe関連でハマり中
javaソースを、C++プリプロセッサに通して、#define や #ifdef を使おうと試みていたり。プリプロセッサとして Visual Studio の cl.exe を利用しようとしてるのだけど、問題に遭遇。
jaavソースは、SJISで記述されているのだけど。Visual Studio 2005 から、文字セット? 文字コード?として、Unicodeを使う仕様になったらしくて。SJISで書かれたjavaソースを渡すと、
あちらから送られてきているbatファイルを見る限り、あちらでは Visual C++ 6.0 の cl.exe を使ってるらしい。今時そんなもん売ってない=入手不可能だし。まだ、現行の cl.exe のオプション中に、入力ファイルや出力ファイルの文字コードを指定するオプションがあれば解決するのかもしれないが。残念ながらそんなオプションは存在していないように見える。
文字コード変換ツールを経由させて解決できないか試みる。nkf -xSw8 hoge.java > utf8_hoge.java で、SJISから、UTF8(BOMあり、半角カタカナ保存)に変換して、そのファイルを、cl.exe /EP /C utf8_hoge.java といった感じで渡した。すると今度は、ソース中の「"文字列データ"」が消滅してしまった。関連情報をネット検索したところ、ソース中に記述された文字列データに関しては、cl.exe 内部でSJISに変換してから扱っている云々と言う話が。携帯アプリのソース = 文字列データとして半角カタカナを多用してるソースだから、そのあたりも絡んできて文字列データが消えてしまうのだろうか。実際、cl.exe を通した直後のファイルを保存させてみて覗いてみたら、コメント文字列はUTF8なのに、文字列データはSJISになっていた。うーん。
batファイル中で sed を経由させて空行その他を削除してるあたりにも若干の問題が。あちらさんは Cygwinを導入して sed を使ってるらしいのだけど。sed だけを使わんがために Cygwin を入れるのも実にアホらしいので、Windowsに移植された sed win32 版を導入して処理させてみたり。しかしそれだと、出力結果の改行コードが CRLF になってしまう。いや、本来Windows環境上ではそのほうが何かと都合がよいであろう気もするのだけど。あちらさんから送られてきた出力結果は LF になってるわけで、比較作業などをした場合に問題になりそうで。
cl.exe を呼ぶ前に、chcp 437 (英語モード)を、呼んだ後で chcp 932 (日本語(SJIS)モード) をそれぞれ呼んでみた。が、結果変わらず。
jaavソースは、SJISで記述されているのだけど。Visual Studio 2005 から、文字セット? 文字コード?として、Unicodeを使う仕様になったらしくて。SJISで書かれたjavaソースを渡すと、
warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。と警告が出てきてしまう。また、プリプロセッサが出力したソレは、UTF8になってるようで。SJISで出力してほしいのだが…。
あちらから送られてきているbatファイルを見る限り、あちらでは Visual C++ 6.0 の cl.exe を使ってるらしい。今時そんなもん売ってない=入手不可能だし。まだ、現行の cl.exe のオプション中に、入力ファイルや出力ファイルの文字コードを指定するオプションがあれば解決するのかもしれないが。残念ながらそんなオプションは存在していないように見える。
文字コード変換ツールを経由させて解決できないか試みる。nkf -xSw8 hoge.java > utf8_hoge.java で、SJISから、UTF8(BOMあり、半角カタカナ保存)に変換して、そのファイルを、cl.exe /EP /C utf8_hoge.java といった感じで渡した。すると今度は、ソース中の「"文字列データ"」が消滅してしまった。関連情報をネット検索したところ、ソース中に記述された文字列データに関しては、cl.exe 内部でSJISに変換してから扱っている云々と言う話が。携帯アプリのソース = 文字列データとして半角カタカナを多用してるソースだから、そのあたりも絡んできて文字列データが消えてしまうのだろうか。実際、cl.exe を通した直後のファイルを保存させてみて覗いてみたら、コメント文字列はUTF8なのに、文字列データはSJISになっていた。うーん。
batファイル中で sed を経由させて空行その他を削除してるあたりにも若干の問題が。あちらさんは Cygwinを導入して sed を使ってるらしいのだけど。sed だけを使わんがために Cygwin を入れるのも実にアホらしいので、Windowsに移植された sed win32 版を導入して処理させてみたり。しかしそれだと、出力結果の改行コードが CRLF になってしまう。いや、本来Windows環境上ではそのほうが何かと都合がよいであろう気もするのだけど。あちらさんから送られてきた出力結果は LF になってるわけで、比較作業などをした場合に問題になりそうで。
cl.exe を呼ぶ前に、chcp 437 (英語モード)を、呼んだ後で chcp 932 (日本語(SJIS)モード) をそれぞれ呼んでみた。が、結果変わらず。
[ ツッコむ ]
以上です。