【Salesforce】ApexでSJISをUTF-8に変換する

【Salesforce】ApexでSJISをUTF-8に変換する

Visualforceの画面からcsvファイルをアップロードし、Apex経由でレコードとして登録する、というのはよくある動きですね。

ファイルの文字コードがUTF-8であれば、Blob.toString()で解決してしまいます。

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_blob.htm

とっても簡単ですね。

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

Apexで文字コード変換

 

一応、自分で納得するまでの考えを忘れないように書いておきます。

開発者コンソールで実施

// コメントは出力結果

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です