【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.