unicode文字列解析
2721 ワード
現象と答え
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文字列を通常の文字列に変換する過程に触れなければなりません.ネット上ではこの問題について多くのブログがありますが、ほとんどは同じです.実現構想は文字列の中に
fastjsonは、unicode文字列解析、JSON.parseObject(String)などの方法が可能です.
原理を実現して、fastjsonは過程を実現して、自ら輪を作ります.
次の内容は具体的に実現し、方式原理とfastjsonの実現方式です.
まずunicodeコードを確認してみます.unicodeコード
fastjsonにおいて、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]コミュニケーションは最も重要なスキルの一つです.