MSSyst.String.adsをよく読んでみると、次の定義がある。
function new_String(
This : Ref := null;
c : Wide_Character;
count : Integer) return Ref;
+が定義されているのはString型だけなので、Wide文字列を変換する場合、どうやらこの方法しかないらしい。コードにすると次のような感じだ。
Mssyst.String.new_String(c => Wide_Character'('ほ'), count => 1)
コードはこれでよいとして、問題はコンパイラだ。ファイルがShift-JISなので、コンパイルオプションに-gnatWsを付けてコンパイルしてみたところ、依然文字化けする。pragma Wide_Character_Encodingなども試してみたが、どうもうまくいかない。仕方が無いのでファイルをUTF-8に変換し、コンパイラオプションを-gnatW8に変更してみたところ、なんとかうまく表示することができた。ShiftJISはもしかすると未実装なのかもしれない。
とりあえず、日本語は通るようになったが、これではさすがに面倒だ。要望として作者に伝えるべきなのか、それとも、他にもっと良い方法が存在するのか。うーん。
こんにちは。
GNATフロントエンドは、-gnatWsを、ワイド文字列に「生のJISコード」として格納しやがります。-gnatWe(EUC-JP)も同じです。
理想的には、ソースの文字コード、バイナリ中のCharacterの文字コード、バイナリ中のWide_Characterの文字コードを全部個別に指定できるべきで、現実的にはソース=Character=環境のロケール、Wide_Characterは常にUTF-16とかでも充分なのですが、どうもAdaCoreの人はその辺まるでわかってない様子で……。
コンパイラのソースのscng.adbあたりを直して使うぐらいしか無いと思います。
http://yudai.arielworks.com/memo/2007/03/31/105330.trackback
末尾に「0 + 1」の計算結果を繋げて下さい。例えば計算結果が「17」の場合、「105330.trackback17」です。これは機械的なトラックバックスパムを防止するための措置です。