💨

armccでShift-JISのC++ファイルをコンパイルする

2024/06/14に公開

armccでShift-JISのC++ファイルをコンパイルする際に必要な設定を解説する。

モチベーション

armccで何も考えずにShift-JISエンコーディングの日本語を含むコードをコンパイルすると、ダメ文字が適切に処理されず、文字のバイト列から0x5Cが取り除かれてしまう。

この問題を解決するためのarmccのコンパイルオプションの設定方法と、その際に発生しうるエラーの対処法を解説する。

armcc

ARM社製の、ARMプロセッサ向けC/C++コンパイラ。

少し古めのArm Compiler 5や更に古いRVCT(RealView Compilation Tools)で使用するコンパイラがこれ。
現行バージョン(2024年現在)のArm Compiler 6はLLVMベースのarmclangというコンパイラが使われており、こちらは本記事の対象外。

コンパイルオプションの設定

WindowsとLinuxで微妙に異なる。

Windows

--multibyte_chars --locale=japaneseオプションを指定する。
また、コンパイル時に表示されるメッセージを日本語にしたい場合、--message_locale=ja_JPを指定する。

armcc --multibyte_chars --locale=japanese --message_locale=ja_JP -c main.cpp

Linux

--multibyte_chars --locale=ja_JP.sjisオプションを指定する。
また、コンパイル時に表示されるメッセージを日本語にしたい場合、OSのエンコードに応じて--message_locale=ja_JP.utf8--message_locale=ja_JP.sjisを指定する。

armcc --multibyte_chars --locale=ja_JP.sjis --message_locale=ja_JP.utf8 -c main.cpp

could not set locale "ja_JP" to allow processing of multibyte charactersが出たら

上記のオプションを設定すると、could not set locale "ja_JP" to allow processing of multibyte charactersのコンパイルエラーが出る場合がある。
これは、OSの言語設定として日本語が存在していないときに発生する。わざわざ日本語をインストールしないLinuxで発生しがち。

以下、Ubuntuでの対処方法を解説する。

  1. 必要なパッケージをインストールする。

    # apt install locales language-pack-ja -y
    
  2. システムのロケール設定ファイルに日本語のShift-JISを追加する。

    # echo "ja_JP.SJIS SHIFT_JIS" >> /etc/locale.gen
    
  3. ロケールを再生成する。

    # locale-gen
    
  4. ja_JP.SJISが追加されたことを確認する。

    $ locale -a
    C
    C.utf8
    POSIX
    ja_JP.sjis
    ja_JP.utf8
    

参考

GitHubで編集を提案

Discussion