Visual C++(cl.exe)で UTF-8 のファイルをコンパイルする

日本語版 Windows では、デフォルトの文字コードとして Shift-JIS(CP932)が広く使われています。
この Shift-JIS、2バイト目が ASCII コードと同じ、という文字がいくつか存在します。

例えば「ソ」の Shift-JIS でのコードは16進数で835cで、2バイト目の5cバックスラッシュ(または¥マーク)と同じです。
このため、例えば

#include <iostream>
int main()
{
    char str[] = "ソ";
    std::cout << str << std::endl;
    return 0;
}

上記を Shift-JIS で保存してコンパイルしてみます。
Visual Studio では問題なくコンパイル・実行できるのですが、gcc(g++)では、

error: missing terminating " character
     char str[] = "▒\";
                  ^

怒られました。
「ソ」の2バイト目と、それに続くダブルクォーテーションがエスケープシーケンスとして処理されてしまうため、文字列の終わりを表すはずのダブルクォーテーションが文字列に含まれてしまい、文字列が終わっていないというエラーになってしまうわけです。

Shift-JIS に対応していないツールでは、似たような問題はしょっちゅう顕在化します。
いわゆる「ダメ文字」問題ですね。
「ダメ文字」でググるといろいろ情報が出てくると思います。


てことで本題。
ファイルの文字コードに Shift-JIS なんて使うのはやめて、UTF-8 を使うようにしよう!

続きを読む

MSYS2 入れてみたけど、pacman がうまく動かなくて困ってた

あけましておめでとうございます。


cmd.exe がイマイチ使いづらいので、Windows での良さげなシェル環境を模索しています。
いろいろ調べてみて、ConsoleZ + Nyagos がわりといい感じに使えそうだなーと思って使ってみていますが、MSYS2 もよく耳にするので試しに入れてみました。

……が、パッケージマネージャである pacman が動いてくれない
こんなエラーが出まくる。

エラー: GPGME error: 無効な暗号エンジンです


ググってみてもなかなかそれらしい答えにたどり着けなかったのですが、
GPGME error: Invalid crypto engine · Issue #393 · Alexpux/MSYS2-packages · GitHub
ここで "MacType can cause this." という文言を見かけました。
ええ、MacType 使っておりますがなにか。

もしかしたらこれかもなー、と思って試してみたら、うまく動くようになりました。

MacType のインストールディレクトリ(C:\Program Files\MacType\ とか)にある MacType.ini に以下を追加:

[UnloadDll]
gpg.exe
pacman.exe


備忘録として一応残しておきます。

雑記 #2 at 2016

前回の記事が……半年前?


年の瀬になってから今年ふたつめの記事を書くとかブログやってる意味あんのかと自分自身に問いたくなりますがそれはさておき。

「トロフィーについて書きます」なんてほざいてた覚えがあるので一応書いておくと、いくつかトロコン達成したタイトルもありますので、ブロンズトロフィーすらロクに取ってなかった去年に比べればたくさん集められたかなーと思います。レベルも17に上がったし。
まぁ、最近は「取れそうなトロフィーだけしっかり取る」というスタンスに変わってきていて、無理にコンプリートを目指そうとはしていません。

疲れますからね。


発売から1か月経ちましたが、FFXVを遊んでいます。
というか積みかけています*1
どれくらい進んでいないかというと、発売前に体験版が出ましたけど、あれで行けるエリアにしか行けてません

積みゲーマーの本領発揮といったところですか。

年末年始に一気に進めてしまいたいんですが、実家に帰省するのでその間は据え置き機タイトルはおあずけです。
いつクリアできることやら。


今年の記事はこれがおそらく最後になると思います。2本目だけど。
それでは、よいお年をお迎えくださいませ。


アディオス、2016。

*1:詰んではいません