はじめに
Windows でお手軽に gcc が使えるようになる 『Dev-C++』 という IDE があります。
元々 Delphi で書かれていたこの IDE を Embarcadero がフォークしたのが 『Embarcadero Dev-C++』 です。
- Embarcadero Dev-C++ (Embarcadero)
- Embarcadero Dev-C++ (GitHub)
- Dev-C++ – Delphi で構築された低メモリ Windows ネイティブ C++ IDE (blogs.embarcadero.com)
- Dev-C++ (bloodshed.net)
- Dev-C++ (sourceforge)
- DevC++-JP プロジェクト日本語トップページ (OSDN)
- Dev-C++ (Wikipedia)
文字化け
インストーラー形式なので、インストールはとても簡単なのですが...
インストールの際はデフォルトのパスではなく、C:\Dev-Cpp
等にインストールする事をオススメします。
初期設定で言語を 日本語
に変更すると文字化けします。
文字化けした場合、〔Alt〕〔T〕〔V〕または、画面右の下側のボタンで言語を変更できます (English (Original)
がデフォルトです)。
解決方法
インストールフォルダの Lang
にある Japanese.lng
をテキストエディタで開き、Lang=日本語
になっている所を Lang=Japanese
に書き替えます。
[lang]
- Lang=日本語
+ Lang=Japanese
Ver=1
1=ファイル(&F)
2=編集(&E)
3=検索(&S)
4=表示(&V)
5=プロジェクト(&P)
6=実行(&X)
7=ツール(&T)
8=ウィンドウ(&W)
9=ヘルプ(&H)
10=デバッグ(&D)
環境設定で Japanese
が選べるようになります。
原因
言語ファイルは Lang
フォルダにあり、環境設定に従いこれをロードしています。日本語なら Japanese.lng
ですね。言語ファイルの文字エンコーディングは ANSI 形式となっています (日本語なら SHIFT_JIS)。内容はこんな感じです。
[lang]
Lang=日本語
Ver=1
1=ファイル(&F)
2=編集(&E)
...
そして ANSI のコードページ判定に Lang パラメータを使っています。
procedure TdevMultiLangSupport.Open(const Filename: String);
var
LangFile: String;
begin
// Load file from languages directory
LangFile := ValidateFile(Filename, devDirs.Lang);
if LangFile = '' then begin
MessageDlg('Could not open language file ' + Filename, mtError, [mbOK], 0);
Exit;
end;
// Load file into fStrings
fStrings.LoadFromFile(LangFile,TEncoding.ANSI);
fLangFile := LangFile;
// Get languange
fCurLang := fStrings.Values['Lang'];
if fCurLang = '' then
fCurLang := ChangeFileExt(ExtractFileName(LangFile), '');
fCurCodePage := GetCodePage(fCurLang); // <- ここ
devData.Language := ExtractFileName(LangFile);
end;
日本語
という文字列からコードページ 932 (Shift_JIS) を引く事ができないのが文字化けの原因です。コードページを引けなかった時は 1252 になるようです。
Encodings: Array[0..MaxEncodings - 1] of TCPData =
(
...
//(CPID: 866; CPName: 'cp866'),
//(CPID: 869; CPName: 'ibm869'),
//(CPID: 870; CPName: 'IBM870'),
//(CPID: 874; CPName: 'windows-874'),
//(CPID: 875; CPName: 'cp875'),
(CPID: 932; CPName: 'shift_jis'; CPLang: 'Japanese';),
(CPID: 936; CPName: 'gb2312'; CPLang: 'Chinese';),
(CPID: 949; CPName: 'ks_c_5601-1987'; CPLang: 'Korean';),
//(CPID: 950; CPName: 'big5'),
//(CPID: 1026; CPName: 'IBM1026'),
//(CPID: 1047; CPName: 'IBM01047'),
//(CPID: 1140; CPName: 'IBM01140'),
//(CPID: 1141; CPName: 'IBM01141'),
...
function GetCodePage(const ALanguage: String): Integer;
var
I: Integer;
begin
Result := 1252; //put the default encoding here
for I := 0 to MaxEncodings - 1 do
if ALanguage.IndexOf(Encodings[I].CPLang)>-1 then
begin
Result := Encodings[I].CPID;
break;
end;
end;
なので、Lang パラメータの値を Japanese
にすれば、文字化けは起こらなくなります。値に Japanese
が含まれればいいので Japanese (日本語)
とかでも大丈夫です。
[lang]
Lang=Japanese (日本語)
Ver=1
1=ファイル(&F)
2=編集(&E)
...
Lang パラメータは言語リストの表示名にも使われているので、プログラムで判定せず、Codepage=932 みたいなパラメータを新設するか、言語ファイルを UTF-8 化した方がいいとは思うのですが...
2024/06/17 にプルリクエストがマージされたため、この問題は解決しています。インストーラは更新されていないようなので、GitHub から言語ファイルを持ってきて手動でマージする必要があります。
おわりに
余談ですが、『Dev-C++』をインストール後、インストールフォルダを USB メモリにコピーするだけでポータブル環境が作れます。devcpp.exe
の代わりに devcppPortable.exe
を実行するとコピーしたフォルダの config
サブフォルダに設定が保存されるようになります。
もう一つ余談ですが、オリジナルの『Dev-C++』は映画『Winny』で『C++ Builder』の代役として使われていましたね。