はじめに
過去にWindowsのコマンドラインプログラムをmsys2のUCRT環境でビルドする方法を模索した記録みたいな記事を書いたのですが,Teratailにc言語 回分についてという記事があり,どうもうまく文字が読めてないみたいな挙動です。(っつ~か回文じゃないのか?)
個人的にはWindows 用 Emacs (Cygwin/MinGW) の UTF-8 対応改善実験の最後の方で説明されているように,MinGW の場合は、msvcrt が CP65001 に対応していないのでどう頑張ってもうまく対応できないということが分かっており,個人的に利用するならmsys2のUCRT64(もしくはCLANG64)だと思うのですが,どうもプログラミングビギナーの心には響かないようです。
なお,VSCodeのUsing GCC with MinGWでも実際にセットアップされているのはUCRT64版の環境ですね。
manifestの準備とリソースの作成
kaibun-utf8.manifestのファイルを用意します。
Windows アプリで UTF-8 コード ページを使用するの情報にもあるように次のような内容のファイルです。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyIdentity type="win32" name="Kaibun" version="0.0.1.0"/> <application> <windowsSettings> <activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage> </windowsSettings> </application> </assembly>
以前紹介したWindowsのコマンドラインプログラムをmsys2のUCRT環境でビルドする方法を模索した記録では<assemblyIdentity>タグの内容をばっさり削除していましたが,どうも仕様1を見ると,<assemblyIdentity>のプロパティはname, versionが必須で,そこが前回引っかかっていたようです。今回は回文だけにname="Kaibun",バージョンは適当にversion="0.0.1.0"として設定します。
そして次のようなkaibun-utf8.rcファイルを用意します。
#include <winresrc.h> CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "kaibun-utf8.manifest"
大元のソースファイルはkaibun.cとします。Teratailのc言語 回分についての記事を参照ください。
次のような一連のコマンドで実行ファイルを作成します。
windres.exe --input-format=rc --output-format=coff -o kaibun.res kaibun-utf8.rc gcc -Wall -o kaibun.exe kaibun.c kaibun.res
manifestを入れないやつも併せて実行した結果は次の通りです。


cp65001の時はucrt64でマニフェスト付きのみうまく認識しているようです。
mingw64はマニフェストをつけてもcp65001をうまく認識していないのがよく分かります。