2013年11月4日月曜日

MinGW + MSYS で日本語

C/C++ Hello Worldでは、わざと日本語の使用を避けていました。日本語を扱うには色々と問題があり、設定などが難しかったためです。

gccのコンパイルで警告になることがある

printf("Hello World¥n");でなく、 printf("こんにちは¥n”);とした場合は問題になりませんが、printf("ソフトウェア¥n”);とした場合にはコンパイル時に警告が表示されます。

なぜかというと円マーク(¥)が原因です。円マークは文字コードが0x5Cなのですが(Linuxでは0x5Cの表示がバックスラッシュ(\)の場合もあります)、Windowsが標準で使用している文字コードのCP932(ShiftJISの一種)では、「ソ」は0x83,0x5Cの2バイトとなっていて、コンパイラが2つ目の0x5Cを円マーク(¥)と間違うためです。他にも「表」などが同様に問題があります。


その対策では、--input-chaset=CP932というオプションを付けます。するとgccは文字コードをUTF-8 に変換してからコンパイルします。しかし、これだけではprintf()で文字化けします。--exec-charset=CP932とすることで、実行ファイル内部の文字列をCP932に変換します。



そもそもvimで日本語入力ができない

まずはvimで日本語が化けます。この対策で、.vimrcの最後の行に
set enc=japan
と入れると良いようです。ここを参照させていただきました。

しかし、日本語入力はうまく行きません。Alt+半角/全角で日本語入力への切換ができるのですが、vimの画面では変な風にスクロールしていってしまいます。
この対策にはminttyを使うと良いようです。以下でセットアップできます。

$ mingw-get install msys-mintty

"mintty -"(ハイフンが必要)を実行するか、msys.batを起動するときに -minttyオプションを付けるとminttyがが起動します。mintty上で起動したvimであれば日本語入力が出来ます。ここを参照させていただきました。以下はminttyの画面です。



さらに日本語ファイル名を使う

上記ではlsで日本語のファイル名がまた文字化けしますし、入力もできません。以下を行うと日本語ファイル名が使えるようになります。

/etc/profileのファイルを編集して最後に以下を追加します。
alias ls='ls --show-control-char'

また、~/.inputrcを編集して16行目以降を以下のように変更します。
# disable/enable 8bit input
set meta-flag on
set input-meta on
set output-meta on
set convert-meta off

同じくここを参照させていただきました。

1 件のコメント:

  1. 私は今しばらくブログサイトにいましたが、今日は私も被害者だったので、自分の話を共有すべきだと感じました。私は6年間HIVに感染していましたが、治療法が得られるとは思っていなかったので、2年間の関係で別れた後も結婚するはずだった男性と結婚することができなくなりました。彼は私がHIV陽性だったことを知りました。だから私は誰かを治療したブログサイトのDr. Ituaについて知り、その人は彼女がどのように治癒したのか、彼女の連絡先の詳細を話した、私はDr.私の負担が完全に終わったのも彼の漢方薬を使用しました。私の息子はすぐに2になり、私は神に感謝し、彼の薬にも感謝します。次の病気を治すことができます。アルツハイマー病、ベーチェット病、クローン病、パーキンソン病、統合失調症、肺がん、乳がん、コロ-直腸がん、血液がん、前立腺がん、siva。致命的な家族性不眠症第V因子ライデン変異、てんかんデュピュイトラン病、線維形成性小細胞腫瘍側Sc、線維筋痛、フルオロキノロン毒性
    症候群線維化異形成症進行強皮症、発作、アルツハイマー病、副腎皮質癌。喘息、アレルギー性疾患。Hiv_エイズ、ヘルペ、Copd、緑内障、白内障、黄斑変性、心血管疾患、肺疾患、肺炎
    認知症、ループス。
    、クッシング病、心不全、多発性硬化症、高血圧、結腸直腸がん、ライム病、血液がん、脳がん、乳がん、肺がん、腎臓がん、HIV、ヘルペス、B型肝炎、肝炎症、糖尿病、子宮筋腫、Get Your Ex戻る、もしあれば(drituaherbalcenter@gmail.com Or Whatsapp Number。+ 2348149277967で彼に連絡してください)彼はまた、いくつかの結婚の問題を処理する方法についてアドバイスすることができます。彼はいい人です。

    返信削除