- 締切済み
Mingwで扱うソースコードの文字コードについて
Mingwでプログラムを作っているのですが、使用する文字コードについてご意見を伺いたくて質問いたします。 コレ!という解がないかもしれない質問なので、色々ご意見をいただければと思います。 よって、全く急ぎの質問ではありません。 1~2週間で解決できればいいな~というのんびりした質問です。 現在、Win7 32bit 環境で、C言語メインで開発しており、Mingwは2017年5月頃に入手したものをそのまま使っております。 バージョンは、 gcc version 6.3.0 (i686-posix-dwarf-rev2, Built by MinGW-W64 project) GNU gdb (GDB) 7.11.1 GNU ld (GNU Binutils) 2.27 iconv (GNU libiconv 1.9) GNU Make 3.81 等となっており、相当古いものです。現在のままでもさほど支障はないのですが、gccにいたっては既にナンバーが2遅れであり、そろそろバージョンアップしようと久しぶりにmingw-get-setup.exeを立ち上げました。 念のため旧バージョンのディレクトリ名を変えて上書きしないようにし、インストール完了しました。 そして、いつものようにmake経由でコンパイルコマンドを入力するとiconv関連でエラーが発生します。 cc1.exe: error: no iconv implementation, cannot convert from cp932 to UTF-8 make: *** [b-102.obj] Error 1 b-102.objというのがmainを含んだoファイルです(MakeファイルをborlandやVC++互換にしているため、拡張子がobjになっています) ソースコードの文字コードはSJIS、プログラム全体としては -DUNICODE -D_UNICODE オプションをつけて、文字列リテラルは _T("")マクロを使い、TCHAR型とtchar.hを使って、 UTF16を内部コードにしています。 コンパイルコマンドは gcc -finput-charset=cp932 -std=gnu99 -DUNICODE -D_UNICODE -O3 -Os -Wall -Wuninitialized -s -c -o b-102.obj b-102.c で、旧バージョンのmingwでは問題ないものでした。 ネットで調べてみると、Mingwの文字コード関係はときどきバグや設定ミスが入るとの事でしたので、2019年1月15日からバージョンアップするたびにインストールしてみていますが、2019年1月27日のバージョンに至るまで解決していません。 現在の最新バージョンとしているのは gcc version 8.2.0 (MinGW.org GCC-8.2.0-3) GNU gdb (GDB) 7.6.1 GNU ld (GNU Binutils) 2.31.1 iconv (GNU libiconv 1.14) GNU Make 3.81 であり、gdbのバージョンがなぜか古いこと以外は問題無いように思います。 そこで本題に戻るわけですが、いくつかの解決策からどれを選ぶか迷っています(私の知らない、想定していない解決策があるかもしれません)。 実際に色々やっている開発現場の方のご意見も頂戴したいと思います。 以下、当方で考えている解決策です。一長一短ありそうなので、「その方法は○○が面倒だ」「Mingwではその方法は△△の理由でオススメしない」など教えてください。 なお、現在環境を切り替えるため、コマンドプロンプトを起動する際に、旧バージョンと新バージョンで作業するため以下の環境変数をsetコマンドで一時設定して使っています。 この問題解決のため、新バージョンでは環境変数をいくつか追加設定していますがうまくいきません。 旧バージョン: PATH=C:\mingw32_2017\bin;%PATH% PATH=C:\mingw32_2017\msys\1.0\bin;%PATH% 新バージョン: set MINGW_HOME=C:\MinGW;%MINGW_HOME% set MSYS_HOME=C:\MinGW\msys\1.0;% MSYS_HOME% set C_INCLUDE_PATH=C:\MinGW\include;%C_INCLUDE_PATH% PATH=C:\MinGW\bin;%PATH% PATH=C:\MinGW\msys\1.0\bin;%PATH% 以下、当方の考えている解決策案です。当方にとって望ましい順です。 案1. 環境変数や設定ファイルを書き換えることで、iconvを望みどおりに動作させる。 現在はMINGW_HOME、MSYS_HOME、C_INCLUDE_PATHしか見つけておらず、もしかしたら新たに設定が追加されているかも?。 案2. コンパイルコマンドやリンカコマンドに適切なオプションを設定する? こういったことができるという情報は把握してないのですが、あるといいな、ぐらいです。 案3. ソースコードの文字コードを全てUTF16に置き換える。 かなり面倒ですが、一旦できれば今後は楽かもと思っています。UTF8にしたくないのは、どうせいつかはUTF16になっていくのに、中途半端に1バイト幅から?バイト幅まですごく可変長な文字コードを使いたくないという理由です。内部コードもUTF-16にしているので、ソースの文字コード、扱うファイルの文字コード、内部文字コードを揃えられたら楽です。 ただ、200近いソースコードを_T("")マクロでせっかくユニコード対応させたのに、口惜しくはあります。 また、MingwでUTF16は面倒すぎるという報告も多数見つけているので、不安ではあります。最新バージョンではどうなのでしょうか。 他にも、VC++やClangにも対応できる無難な文字コードを選びたいと思っています。 さらにいずれQtも使ってみたいので、そういった有名な外部ライブラリとの相性をご存知の方はご教授ください。 案4. makeでコンパイル命令を出す際に、自動的にiconvを呼び出して、別ファイルに出力するのではなく、フィルターのように機能させる方法があれば・・・。調べてみましたが、それらしい機能は見つかりませんでした。 案5. ソースコードをUTF8に統一する。 現在わかっている範囲で一番やりたくない方法です。 案6. Mingwのアップデートを待つ。 いまのところ効果無しですが、うまくいく目算があればもうすこし粘ろうと思います。 案7. 上記以外の方法。 当方が知らないだけで、インストール時の隠し設定とかあるかも、という期待を込めて。 現在うまくやってらっしゃる方、開発現場の裏技を知っている方、そのほか「面倒だけどウチはこれで妥協してる」など、いろいろな情報をお待ちしています。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ballville
- ベストアンサー率47% (233/487)
私も「一番やりたくない」とおっしゃるutf-8に一票かな。 Linux界隈は多くのディストリビューションでEUCからutf-8に移行しました。Cygwinも日本語を扱うときはいつのまにか(mintty導入のころ?)sjisでなくutf-8が標準になりました。 ここへきて、windowsの標準シェルであるpowershellも6.0以降、utf16ではなくutf-8を標準エンコードとするみたいです。 https://docs.microsoft.com/ja-jp/powershell/scripting/whats-new/what-s-new-in-powershell-core-60?view=powershell-6#default-encoding-is-utf-8-without-a-bom-except-for-new-modulemanifest
- unokwave
- ベストアンサー率58% (966/1654)
MinGWは殆ど使った事がないので適切なアドバイスはできませんが、 >どうせいつかはUTF16になっていくのに、 これに違和感を覚えています。 世の中の動きとしてはutf8に集約されつつあるように見えます。 utf8が支持される理由は、エンディアンの問題がなく、プラットフォームごとのデータ長を意識せずに済むからです。 それと変換はPowerShell等からCUIで行えば「かなり面倒」というほどではないと思います。
お礼
早速の回答、ありがとうございます。 UTF-8については、私の勘違いだったようです。 Windowsの内部文字コードがUNICODE→UTF16と変化していったと思っていましたが、UNICODE==UTF-8ではないし、もともとUTF16だったようですね。 ご意見を受けて色々調べてみたところ、かなりUTF-8を侮っていたと気づきました。 オプションコマンド等で対応できない場合は、ソースコード全部UTF-8に変更することを視野に入れます。 ありがとうございます。
お礼
回答ありがとうございます。 どうやらUTF-8を過小評価していたようです。 他の方法が見つからない場合は、UTF-8への全転換を視野に入れます。 ありがとうございました。