Apex内で生成した文字列は文字コードがUTF-8であるため
以下のようなコードだと添付ファイルは全てUTF-8で作成されます。
String result = 'あいうえお漢字カタカナ';
Attachment att = new Attachment();
att.Body = Blob.valueOf(result);
att.Name = 'hoge.txt';
att.parentId = '001A000000rJ9he';
insert att;
そこで、Apexのみを使ってUTF-8以外の文字コードのファイルを作成するには
以下のように書くことで実装できます。
※パーセントエンコーディングされる文字列のみ含む前提です。
String result = 'あいうえお漢字カタカナ';
String encodedResult = EncodingUtil.urlEncode(result, 'Shift-JIS').replaceAll('%','');
Attachment att = new Attachment();
att.Body = EncodingUtil.convertFromHex(encodedResult);
att.Name = 'hoge.txt';
att.parentId = '001A000000rJ9he';
insert att;
ポイントとしては以下のとおりです。
- Apexで任意の文字コードのバイト列を直接取得するメソッドがない。
- EncodingUtil.urlEncodeを使えばASCII等のURIとして利用できる文字種以外は 指定の文字コードでパーセントエンコーディングされた文字列を取得できる。
- パーセントエンコーディングされた文字列はバイト列の16進数表記なので convertFromHexでバイト列に戻せる。
パーセントエンコーディングされない文字列は予め正規表現等で処理しておく必要があります。
また、エンコーディングに失敗すると、失敗した文字列が「?」に変換されるようなので
任意の文字列が文字コード変換後に任意のエンコーディングに
対応しているかどうかの確認も可能です。
(予め「?」自体の文字列を取り除いてからEncodingUtil.urlEncodeでバイト列取得する感じ)
参考URLはコチラ↓
memo: Force.com : VF 画面から CSV ファイルをアップロードし、内容を画面に表示したい (ファイル文字コード Shift_JIS 編)
ちなみにVFを介すのであればapex:pageタグのcontentTypeを指定すれば良いので楽ちんです。
<apex:page contentType="text/plain;charset=Shift-JIS">あいうえお漢字カタカナ</apex:page>