Archive for 2008/07/24

ソースファイルのエンコーディング変換

WinCE 6.0 のソースファイルの中には、日本語環境でビルドするとエラーになってしまうものがあります。たとえば、
 <WINCE600>/PUBLIC/COMMON/OAK/DRIVERS/BLOCK/MSFLASH/
にある FMDWRAPPERPDD というサブプロジェクト(※PlatofmBuilder/VS .NET 2005 の「ソリューションエクスプローラー」では、”fmdwrapper” という小文字表記になります)をビルドすると、次のエラーが出ます:

BUILD: [01:0000000035:PROGC ] Compiling .\fmdwrapperpdd.cpp
BUILD: [01:0000000038:ERRORE] d:\apps\wince600\public\common\oak\drivers\block\msflash\fmdwrapperpdd\FmdWrapperPdd.h : error C2220: warning treated as error – no ‘object’ file generated
BUILD: [01:0000000039:WARNN ] d:\apps\wince600\public\common\oak\drivers\block\msflash\fmdwrapperpdd\FmdWrapperPdd.h : warning C4819: The file contains a character that cannot be represented in the current code page (932). Save the file in Unicode format to prevent data loss
BUILD: [01:0000000040:PROGC ] Compiling .\fmdwrappermain.cpp
BUILD: [01:0000000043:ERRORE] d:\apps\wince600\public\common\oak\drivers\block\msflash\fmdwrapperpdd\FmdWrapperPdd.h : error C2220: warning treated as error – no ‘object’ file generated
BUILD: [01:0000000044:WARNN ] d:\apps\wince600\public\common\oak\drivers\block\msflash\fmdwrapperpdd\FmdWrapperPdd.h : warning C4819: The file contains a character that cannot be represented in the current code page (932). Save the file in Unicode format to prevent data loss

ここで、エラー行のメッセージは “warning treated as error – no ‘object’ file generated” なのですが、その原因は、警告行のメッセージで報告されています:

 The file contains a character that cannot be represented in the current code page (932). Save the file in Unicode format to prevent data loss

メッセージの内容は、コンパイラがテキストファイルを読む際に、現在設定されているコードページでは表現不可能な文字が含まれている、というものです。そのため、Unicode で保存し直せと言っていますので、このファイル(FmdWrapperPdd.h)のエンコーディングを変換しなければいけません。

実は、FmdWrapperPdd.h の内容をよく見ると、FmdWrapperPdd クラスの定義で、LockBlocks() メソッドの宣言に書かれているコメントに、余計な文字が付いているのが原因だと分かります。80行目にある、以下の箇所です:

    //Hardware lock a range of physical blocks. Must be implemented if block locking is to be 
    // supported.  BlockRun specifies the run of blocks to lock.  All other blocks are assumed
    // to be unlocked.
    virtual LRESULT LockBlocks (
        IN DWORD BlockRunCount,
        IN BLOCK_RUN BlockRunList[]);

ここで、コメント先頭の “Hardware” の前に、余計な文字が入っているのです。おそらく、意図的なものではなく、このヘッダファイルが書かれた時に、不注意なタイプ入力ミスがあったなどしたのでしょう。この余計な文字を削ってやれば、コンパイルエラーが解消されます。

とはいえ、このようなコンパイルエラーが起きた際に、原因となっている文字を探す時間がない、という場合もあるでしょう。そのような場合は、コンパイラが出したメッセージの通り、ファイルのキャラクタエンコーディングを変換してやる、というのが安直です。さいわい、VS .NET 2005 の IDE には、テキストファイルのキャラクタエンコーディングを変換する機能があります。

この手の機能は、最近の IDE(統合開発環境)では珍しくありませんが、あると便利なことが多いものです。僕は、VS .NET 2005 よりも動きが軽快という理由で、もっぱら VC++ 6 の IDE をコーディングの際のエディタに使っていますが、VC++ 6 の IDE には、このエンコーディング変換機能がないため、若干不便に思います(余談になりますが、WinCE 用のプロジェクトでも、WinCE に依存しない部分は、VC++ 6 の IDE でコーディングして、ビルドと単体テストを済ませてから WinCE のプロジェクトへ取り込む、という手順で作業を進めることもあります)。

さて、ご存知ない方のために、VS .2005 の IDE でテキストファイルのエンコーディング変換を行う手順を説明します。キャラクタエンコーディングに加え、改行文字も変換できますから、わりに重宝しています。手順は、次の通りです:

 1.) 変換したいファイルを IDE で開きます。 

 2.) Alt-F キーと A キーを入力するか、または、[ファイル] -> [名前を付けて xxx を保存...] メニューを選択して下さい(※”xxx” は、実際のファイル名)。「名前を付けてファイルを保存」ダイアログが開きます。

 3.) 開いたダイアログの「保存」ボタンの右に付いているプルダウンメニューをクリックして開き、「エンコード付きで保存…」を選択して下さい。

 4.) 既存のファイルを置き換えてよいかというアラートが出ますので、「OK」をクリックして閉じて下さい。「保存オプションの詳細設定」というダイアログが開きます。

 5.) 「保存オプションの詳細設定」ダイアログには、「エンコード」と「行の終わり」という二つのドロップダウンリストがあります。このドロップダウンリストで、それぞれ、キャラクタエンコーディングと改行コードを指定できます。

 6.) 設定したいキャラクタエンコーディングと改行コードを指定したら、「OK」ボタンをクリックして保存して下さい。

上記の手順で、キャラクタエンコーディングに”Unicode(UTF-8 シグネチャ(BOM)付き)- コードページ 65001”を指定して上書き保存すると、上述したコンパイルエラーを解消できます。試してみて下さい。

なお、PlatformBuilder のコンパイラは、ファイル先頭の BOM がないと正しく認識できないようで、”Unicode(UTF-8 シグネチャ(BOM)なし)- コードページ 65001”で保存した場合は、上述のコンパイルエラーは解消できません。この点は、ご注意下さい。
 
ところで、上述のビルドエラーには、OSDesign を単純にビルドする場合には遭遇しません。プレビルドしたバイナリが使われるので、上記のソースのコンパイルが起きないからです。しかし、SYSGEN 変数の設定を変えるなどして、「システム生成」を行う必要が生じて
 [ビルド] -> [詳細なビルドコマンド] -> [ビルドおよびシステム生成]
メニューを実行した場合には、上述のビルドエラーに遭遇することでしょう。もちろん、日本語環境を使っている場合には、ですけれど。

Add comment 2008/07/24 koga


Categories

Links

Posts by Authors

Recent Posts

Calendar

2008年7月
    9月 »
 12345
6789101112
13141516171819
20212223242526
2728293031  

Posts by Month

Posts by Category

Meta