【Salesforce】ApexでSJISをUTF-8に変換する
Visualforceの画面からcsvファイルをアップロードし、Apex経由でレコードとして登録する、というのはよくある動きですね。
ファイルの文字コードがUTF-8であれば、Blob.toString()で解決してしまいます。
とっても簡単ですね。
private String blobToString(Blob data){ String csvBody; // Stringに変換する csvBody = data.toString(); return csvBody; }
しかし、問題は文字コードがSJISの場合です。
調べてみても、Salesforceのメソッドにて一撃で解決する方法はなさそうです。
しかし、先人たちがちゃんと解決方法を見つけてくれていますね。
HEX文字列に変換してから2文字ごとに%の文字を付与し、URLエンコードの状態としてから通常の文字列にデコードするようです。
文字で見るよりソースを見た方が簡単ですね。
private String blobToUtf8(Blob data){ String result String body; String hex; // HEX文字列に変換する hex = EncodingUtil.convertToHex(data); // URLエンコード状態にする result = ''; for (Integer i = 0, size = hex.length(); i < size; i = i + 2) { result = result + '%' + hex.substring(i, i + 2); } // SJISに変換する body = EncodingUtil.urlDecode(result, 'sjis'); // 文字コードに合わせたデコードを! // body = EncodingUtil.urlDecode(result, 'Windows-31J'); return body; }
先人たちはもっと頑張っていました。
同じ方式でUTF-8を別の文字コードにも出来るようです。
http://vaindespair.blogspot.jp/2012/07/blog-post_26.html
一応、自分で納得するまでの考えを忘れないように書いておきます。
開発者コンソールで実施
// コメントは出力結果 // A system.debug(EncodingUtil.urlEncode('A', 'utf-8')); // A system.debug(EncodingUtil.urlEncode('A', 'sjis')); // %E3%81%82 system.debug(EncodingUtil.urlEncode('あ', 'utf-8')); // %82%A0 system.debug(EncodingUtil.urlEncode('あ', 'sjis')); // e38182 system.debug(EncodingUtil.convertToHex(Blob.valueOf('あ'))); // 41 system.debug(EncodingUtil.convertToHex(Blob.valueOf('A'))); // あ system.debug(EncodingUtil.urlDecode('%e3%81%82', 'utf-8')); // あ system.debug(EncodingUtil.urlDecode('%82%a0', 'sjis')); // A system.debug(EncodingUtil.urlDecode('%41', 'utf-8')); // A system.debug(EncodingUtil.urlDecode('%41', 'sjis')); // A system.debug(EncodingUtil.urlDecode('A', 'utf-8')); // A system.debug(EncodingUtil.urlDecode('A', 'sjis'));
utf-8
A⇒41
あ⇒E38181
sjis
A⇒41
あ⇒82a0
みなさん、頭が良いですよね。
No comments.