logo

サイト内検索
ココログ最強検索 by 暴想

最近のトラックバック

無料ブログはココログ

« Force.com研修メルマガQ&A集:ファイルのアップロード | トップページ | Salesforceのconnection.jsとapex.js »

Force.com ApexでUnicode \uxxxx を文字に変換

Force.comのApexのコードからFacebookのGraph APIにアクセスしてJSONのデータを入手したところ、日本語の文字がすべて、\uxxxx の形になって返ってくる。

たとえば、私の作ったFacebook Page 「東京多摩地区・自転車ガイド」の情報を見ると、こんな感じ。

{
   "id": "136781559729514",
   "name": "\u6771\u4eac\u591a\u6469\u5730\u533a\u30fb\u81ea\u8ee2\u8eca\u30ac\u30a4\u30c9",
   "picture": "http://profile.ak.fbcdn.net/hprofile-ak-snc4/203479_136781559729514_3670300_s.jpg",
   "link": "http://www.facebook.com/pages/\u0025E6\u00259D\u0025B1\u0025E4\u0025BA\u0025AC\u0025E5\u0025A4\u00259A\u0025E6\u002591\u0025A9\u0025E5\u00259C\u0025B0\u0025E5\u00258C\u0025BA\u0025E8\u002587\u0025AA\u0025E8\u0025BB\u0025A2\u0025E8\u0025BB\u00258A\u0025E3\u002582\u0025AC\u0025E3\u002582\u0025A4\u0025E3\u002583\u002589/136781559729514",
   "likes": 12,
   "category": "Community",
   "description": "\u30b9\u30dd\u30fc\u30c4\u81ea\u8ee2\u8eca\u611b\u597d\u5bb6\u306e\u305f\u3081\u306e\u591a\u6469\u5730\u533a\u304b\u3089\u81ea\u8d70\u3057\u3066\u884c\u3051\u308b\u7bc4\u56f2\u306e\u304a\u52e7\u3081\u30b9\u30dd\u30c3\u30c8\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002",
   "can_post": true
}

これは正しいのか?と調べたところ、JSONのルールでは、Unicodeは上記形式で表現するのが正道だということでした。

さて、この形式を普通の文字にApex上で変換するメソッドが無いか調べたが、見当たらない。かろうじて、StringのfromCharArrayというメソッドでIntegerの配列から文字列を作れる事はわかった。
結局、Javaの例やあちこちのサンプルコードを参考にして以下のようなサービスメソッドを作りました。
メソッド decUtf です。
[APEXコード]
     //\uxxxx系をdeescapeする
    public static String decUtf(String s) {
        if (s == null) return null;
        Pattern p = Pattern.compile('\\\\u[0-9a-f]{4}');
        Matcher m = p.matcher(s);
        String sb = '';
        Integer st = 0;
        while (m.find()) {
            String chars = m.group().substring(2, 6);
            if(m.start() -st>0){
                sb = sb + s.substring(st,m.start());
                system.debug(sb);
            }
            st = m.end();
            sb = sb + String.fromCharArray(hexToInt(chars));
        }
        if(s.length()-st>0){
            sb = sb + s.substring(st,s.length());
        }
        return sb;
    }

    private static Map<String,Integer> hexMap = new Map<String,Integer>();
    static {
        hexMap.put('0',0);
        hexMap.put('1',1);
        hexMap.put('2',2);
        hexMap.put('3',3);
        hexMap.put('4',4);
        hexMap.put('5',5);
        hexMap.put('6',6);
        hexMap.put('7',7);
        hexMap.put('8',8);
        hexMap.put('9',9);
        hexMap.put('A',10);
        hexMap.put('B',11);
        hexMap.put('C',12);
        hexMap.put('D',13);
        hexMap.put('E',14);
        hexMap.put('F',15);
        hexMap.put('a',10);
        hexMap.put('b',11);
        hexMap.put('c',12);
        hexMap.put('d',13);
        hexMap.put('e',14);
        hexMap.put('f',15);
    }

    public static List<Integer> hexToInt(String hex) {
        List<Integer> retVal = new List<Integer>();
        for(Integer i=0;i<hex.length();i+=4) {
            retVal.add(hexMap.get(hex.substring(i,i+1)) * 16 * 16 * 16 +hexMap.get(hex.substring(i+1,i+2)) * 16 * 16
             +hexMap.get(hex.substring(i+2,i+3)) * 16 + hexMap.get(hex.substring(i+3,i+4)));
        }
        return retVal;
    }

引数の文字列の中から、\uxxxxの形式の部分を正規表現で抜き出して、文字に変換します。

いかかでしょうか?

« Force.com研修メルマガQ&A集:ファイルのアップロード | トップページ | Salesforceのconnection.jsとapex.js »

Force.com」カテゴリの記事

Salesforce」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1482716/40471685

この記事へのトラックバック一覧です: Force.com ApexでUnicode \uxxxx を文字に変換:

« Force.com研修メルマガQ&A集:ファイルのアップロード | トップページ | Salesforceのconnection.jsとapex.js »