Embarcadero Dev-C++ を日本語化しようとすると文字化けする件

# はじめに

Windows でお手軽に gcc が使えるようになる **『Dev-C++』** という IDE があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/334be4eb-b1fa-4104-c199-57dc60a541d9.png)

元々 Delphi で書かれていたこの IDE を Embarcadero がフォークしたのが **『Embarcadero Dev-C++』** です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/75cdefa8-79de-4d14-755a-954814c7caa7.png)

 - [Embarcadero Dev-C++ (Embarcadero)](https://www.embarcadero.com/jp/free-tools/dev-cpp)
 - [Embarcadero Dev-C++ (GitHub)](https://github.com/Embarcadero/Dev-Cpp)
 - [Dev-C++ – Delphi で構築された低メモリ Windows ネイティブ C++ IDE (blogs.embarcadero.com)](https://blogs.embarcadero.com/dev-c-is-a-low-memory-windows-native-c-ide-built-in-delphi-ja/)
 - [Dev-C++ (bloodshed.net)](https://www.bloodshed.net/)
 - [Dev-C++ (sourceforge)](https://sourceforge.net/projects/dev-cpp/files/Sources/Dev-C%2B%2B%204.9.9.2%20sources/devcpp-4.9.9.2-src.zip/download)
 - [DevC++-JP プロジェクト日本語トップページ (OSDN)](https://ja.osdn.net/projects/dev-cpp-jp/)
 - [Dev-C++ (Wikipedia)](https://ja.wikipedia.org/wiki/Dev-C%2B%2B)

# 文字化け

インストーラー形式なので、インストールはとても簡単なのですが...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/94dcbc9a-aab8-9210-8272-9deb087a66bc.png)

:::note
インストールの際はデフォルトのパスではなく、`C:\Dev-Cpp` 等にインストールする事をオススメします。
:::

初期設定で言語を `日本語` に変更すると文字化けします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/fa1d25f0-6d96-763b-622c-e517a95097b2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/22c0a366-f933-3c7e-27e1-932ea0aa2cd8.png)

文字化けした場合、〔Alt〕〔T〕〔V〕または、画面右の下側のボタンで言語を変更できます (`English (Original)` がデフォルトです)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/13f349d6-8cbc-dacd-666d-8a7889fc66c6.png)

## 解決方法

インストールフォルダの `Lang` にある `Japanese.lng` をテキストエディタで開き、`Lang=日本語` になっている所を `Lang=Japanese` に書き替えます。

```diff_ini
[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` が選べるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/f564a1c7-b8c4-08de-974f-127652dc3797.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/c21e639e-bd8d-b451-2870-0efc29c3038f.png)

## 原因

言語ファイルは `Lang` フォルダにあり、環境設定に従いこれをロードしています。日本語なら `Japanese.lng` ですね。言語ファイルの文字エンコーディングは ANSI 形式となっています (日本語なら SHIFT_JIS)。内容はこんな感じです。

```ini:Japanese.lng
[lang]
Lang=日本語
Ver=1
1=ファイル(&F)
2=編集(&E)
...
```

そして ANSI のコードページ判定に Lang パラメータを使っています。

```pascal:MultiLangSupport.pas
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 になるようです。

```pascal:MultiLangSupport.pas
    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'),
      ...
```

```pascal:MultiLangSupport.pas
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 (日本語)` とかでも大丈夫です。

```ini:Japanese.lng
[lang]
Lang=Japanese (日本語)
Ver=1
1=ファイル(&F)
2=編集(&E)
...
```

Lang パラメータは言語リストの表示名にも使われているので、プログラムで判定せず、Codepage=932 みたいなパラメータを新設するか、言語ファイルを UTF-8 化した方がいいとは思うのですが...


:::note
2024/06/17 にプルリクエストがマージされたため、この問題は解決しています。インストーラは更新されていないようなので、GitHub から言語ファイルを持ってきて手動でマージする必要があります。

 - [[JA] Languages (Github)](https://github.com/Embarcadero/Dev-Cpp/issues/297)
:::


# おわりに
余談ですが、『Dev-C++』をインストール後、インストールフォルダを USB メモリにコピーするだけでポータブル環境が作れます。`devcpp.exe` の代わりに `devcppPortable.exe` を実行するとコピーしたフォルダの `config` サブフォルダに設定が保存されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/8f646f66-7d72-7157-c178-b6b72600e2f3.png)

もう一つ余談ですが、オリジナルの『Dev-C++』は映画『Winny』で『C++ Builder』の代役として使われていましたね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/c9b0ce9f-0c51-84d1-0ea7-c7e953d21146.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/d256bbda-05cd-fb6c-0c01-356d854cfcde.png)

 - [映画『Winny』公式サイト](https://winny-movie.com/)
 - [C++ Builder (Embarcadero)](https://www.embarcadero.com/jp/products/cbuilder)