将 NCR(Numeric Character Reference) 字符转换为真实字符的方法

开发过程中遇到一种奇怪的编码格式:

每日一色|蓝白~

使用decode/unescape/decodeURI解码均无效.研究一番,总结一下.

实际上上面这种奇怪的编码格式并不是编码,而是一种叫做 NCR(Numeric Character Reference) 的标记结构.

Numeric Character Reference

看看维基百科的解释:

A numeric character reference (NCR) is a common markup construct used in SGML and other SGML-related markup languages such as HTML and XML. It consists of a short sequence of characters that, in turn, represent a single character from the Universal Charact

NCR是一种常见的标记结构,用于SGML和其他SGML相似的标记语言,如HTML和XML。它由一个短的字符序列组成,代表一个字符(全球的文字字符)。

NCR编码是由一个与号(&)跟着一个井号(#), 然后跟着这个字符的Unicode编码值, 最后跟着一个分号组成的.

使用java解决,在项目中实践OK。

public static String decode(String str) {
        StringBuffer sb = new StringBuffer();
        int i1=0;
        int i2=0;


        while(i2<str.length()) {
           i1 = str.indexOf("&#",i2);
           if (i1 == -1 ) {
                sb.append(str.substring(i2));
                break ;
           }
           sb.append(str.substring(i2, i1));
           i2 = str.indexOf(";", i1);
           if (i2 == -1 ) {
                sb.append(str.substring(i1));
                break ;
           }


           String tok = str.substring(i1+2, i2);
            try {
                 int radix = 10 ;
                 if (tok.charAt(0) == 'x' || tok.charAt(0) == 'X') {
                    radix = 16 ;
                    tok = tok.substring(1);
                 }
                 sb.append((char) Integer.parseInt(tok, radix));
            } catch (NumberFormatException exp) {
                 //sb.append(unknownCh);
            }
            i2++ ;
        }
        return sb.toString();
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值