unicode文字列解析


現象と答え
httpインターフェースで受信する時、多くのインタフェースの提供者は漢字をunicodeの方式を通じて(通って)伝来することが好きで、数字と字母は不変を維持して、このようにします.
{Content”:「[reply]CocoWu 892[/reply]\u 6 c 9 f\u 901 a\u 662 f\u 6700\u 91 cd\u 8981\u 6280\u 80 fd\u 4 e 4 b\u 4 e 00」}
ここではunicode文字列を通常の文字列に変換する過程に触れなければなりません.ネット上ではこの問題について多くのブログがありますが、ほとんどは同じです.実現構想は文字列の中に
[0-9]{4}
文字列を見つけ、マッチングした4桁の数字をInteger.parseInt()を通じて文字列に変換します.私たちは必ず開源jarがこの仕事を完成したと思います.自分で車輪を作る必要はないです.探してみると、fastjsonは自動的にunicode文字列を変換することができます.
fastjsonは、unicode文字列解析、JSON.parseObject(String)などの方法が可能です.
原理を実現して、fastjsonは過程を実現して、自ら輪を作ります.
次の内容は具体的に実現し、方式原理とfastjsonの実現方式です.
まずunicodeコードを確認してみます.unicodeコード\u8981\uが表示されています.これはunicodeコードで、8981はコードの内容で、16桁の数字です.8981によってunicodeコードライブラリに対応する文字が見つかります.\は、stringにおける文字は実際に\\であり、8981(char)Integer.parseInt("8981",16)を介してコードを変換することができる.
fastjsonにおいて、unicodeの解析はJSONLexerBase.scanString()にある.fastjson文字列(遍歴)は、現在の文字が"であることが分かりました.scanString()方法の内容は以下の通りで、巡回した後の文字がならば、サイクルから飛び出します.\\が特殊文字解析に入ると、\"
\uなどのように、\uならunicode解析を開始する.
ch = next();
switch (ch) {
  case ...
  
  case 'u':
    char u1 = ch = next();
    char u2 = ch = next();
    char u3 = ch = next();
    char u4 = ch = next();
    int val = Integer.parseInt(new String(new char[] { u1, u2, u3, u4 }), 16);
    putChar((char) val);
    break;
}
一つのunicode解析だけをすれば、正則を使ってマッチと置換ができます.これは自作の車輪で、まねるString.replace Allです.
    public String parseString(String content) {
        String unicodeRegix = "\\\\u(.{4})";
        Pattern pattern = Pattern.compile(unicodeRegix);
        Matcher matcher = pattern.matcher(content);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            String result = matcher.group(1);
            int val = Integer.valueOf(result,16);
            matcher.appendReplacement(sb, "" + (char) val);
        }
        matcher.appendTail(sb);
        return sb.toString();
    }
呼び出しと結果
    @Test
    public void parseString() {
        UnicodeUtil unicodeUtil = new UnicodeUtil();
        System.out.println(unicodeUtil.parseString("{\"Content\":\"[reply]CocoWu892[\\/reply]\
\\u6c9f\\u901a\\u662f" + "\\u6700\\u91cd\\u8981\\u7684\\u6280\\u80fd\\u4e4b\\u4e00\"}")); }
Connected to the target VM,address:‘127.0.0.1:60255’,transport:‘socket’{Content]:“reply”CocoWu 892[/reply]コミュニケーションは最も重要なスキルの一つです.