Salesforceと文字コード

はじめに

こんにちは。

テラスカイの八木です。

さっそくですが、皆さんSalesforceを触っているときに文字コード意識されていますか?
Salesforce単独で使用している場合はあまり意識しなくても問題はないかも知れませんが、他システムとの連携(特に基幹系など)があると意識せざるを得ませんね。

今回は文字コードについていくつかパターンを試してみたいと思います。

そもそもSalesforceの文字コードは?


Salesforce内部ではUTF-8として処理されています。
UTF-8である文字(例として㊑)を実際に標準画面で登録してみましょう。

UTF-8(非サロゲート).PNG
問題なく登録できましたね。

せっかくUTF-8なのでサロゲートペア(例として𩸽)も登録してみましょう。

UTF-8(サロゲート).PNG
こちらも問題なく登録できましたね。

ちなみにどの文字コードに対応しているかはWindowsならIMEパッドで確認できます。

㊑について、Shift_JISがハイフンとなっていることが分かると思います。

IMEパッド.PNG

SalesforceはUTF-8以外使えないの?

いえいえそんなことはありません。

以下のようにいくつかの設定で文字コードを変更することができます。

  • データローダのパラメータ設定

DataLoader.PNG

  • Visualforceのcontent-Type設定
<apex:page contentType="text/html;charset=Shift_JIS" showHeader="false">

  • レポートのエクスポート設定

レポート.PNG
ただし、標準画面については文字コードについて設定する箇所がないので、UTF-8以外に対応するのは難しいと思われます。

SalesforceがUTF-8なのはわかったけど、基幹と連携するからShift_JISのみ許可したいんだけど?

さきほど登録したUTF-8の文字をShift_JISにエンコードしてレポート出力すると「?」になっていると思います。
このままでは文字化けした状態になってしまうので、出来ればSalesforce登録時にエラーになると助かりますね。

Salesforceの設定ではShift_JISのみ許可するなどはできないと思われますので、以下のようなチェック処理を作成し、トリガなどで呼び出すと良いと思います。

public with sharing class DemoCheckUtility {

    /**
     * 許可された文字かどうか
     */
    private static String ENCODING_SCHEME = 'Shift_JIS';
    public static Boolean isAllowedCharacters(String sentence) {

        if (String.isBlank(sentence)) {
            return true;
        }

        // 指定文字コードに変換
        String encode = EncodingUtil.urlEncode(sentence, ENCODING_SCHEME);
        String decode = EncodingUtil.urlDecode(encode, ENCODING_SCHEME);

        // 変換前後で比較
        if (sentence != decode) {
            return false;
        }

        return true;
    }

}

チェック処理を適用したらどうなるか見てみましょう。

さきほどの文字登録の「制限あり項目」に上記チェック処理を適用したので、UTF-8の文字を登録してみます。

登録エラー.PNG

登録エラー2.PNG

きちんとエラーになっていますね。これでSalesforceに登録する時点で連携できない文字を除外できるのではないでしょうか。

おわりに

他システムとデータを連携した際に「?」と表示されるとドキっとしますね。
そうならないように事前に文字コードの知識を深めて作業できると良いですね。