java中如何忽略字符串中的转义字符--转载

原文地址:http://my.oschina.net/u/1010578/blog/366252

起因

    这几天工作上需要跟另一个同事联调rest接口,我这边是java他是php,返回报文是json格式。接口调用成功后,输出返回的报文中有类似“\u79fb\u52a8\u4e92\u8054\u7f51\u5e94\u7528 ”的Unicode字符,有点纳闷,记得java是会自动转换Unicode字符为中文才对。

    通过断点debug一看,发现返回的报文在程序中被转换为“\u79fb\u52a8\u4e92\u8054\u7f51\u5e94\u7528”,两个反斜杠表示字符‘\’,所以输出的不是Unicode对应的中文,而是“像Unicode”的字符串了。

解决方案

    只要把得到的报文中的“\”换成“\”,我想就能正常地将Unicode输出成中文了,首先想到的是使用字符串的replaceAll()方法。使用replaceAll(“\\“,“\“),但是发现输出结果没有任何变化。 
查了下API文档,replaceAll()方法的定义是:

public String replaceAll( String regex,String replacement)  ;

    也就是第一个参数指的是正则表达式,所以“\\”用正则表达式的方式来看,匹配的是字符串中的两个\字符,而不是java中的‘\’转义符。换句话说,就是regex参数作为正则表达式查找的源字符串是已经转义过的“\u79fb\u52a8\u4e92\u8054\u7f51\u5e94\u7528”,而不是转义前的“\\u79fb\\u52a8\\u4e92\\u8054\\u7f51\\u5e94\\u7528”,所以replaceAll(“\\“,“\“)自然没效果了。

    后来在StackOverFlow上找到一个忽略转义的工具类, org.apache.commons.lang.StringEscapeUtils ,里面有忽略各种语言的转义符号的方法,既好用也便于理解,就直接拿来用了。 
其中unescapeJava(String s)方法是来处理java转义字符的,可以将字符串中的 “\”转换为 “\”,“‘”转换为“‘”等。通过这个方法处理以上字符串,刚好能够满足我的需求。

public class Test(){

    public static void main(String[] args) {
        String s = "\\u79fb\\u52a8\\u4e92\\u8054\\u7f51\\u5e94\\u7528";
        String s2 = StringEscapeUtils.unescapeJava(s);
        System.out.println(s);
        System.out.println(s2);

    }

}

输出结果:
\u79fb\u52a8\u4e92\u8054\u7f51\u5e94\u7528
移动互联网应用

    附上unescapeJava()方法处理转义字符的相关源码,便于理解。

public static void unescapeJava(Writer out, String str) throws IOException {
    if(out == null) {
        throw new IllegalArgumentException("The Writer must not be null");
    } else if(str != null) {
        int sz = str.length();
        StrBuilder unicode = new StrBuilder(4);
        boolean hadSlash = false;
        boolean inUnicode = false;

        for(int i = 0; i < sz; ++i) {
            char ch = str.charAt(i);
            if(inUnicode) {
                unicode.append(ch);
                if(unicode.length() == 4) {
                    try {
                        int nfe = Integer.parseInt(unicode.toString(), 16);
                        out.write((char)nfe);
                        unicode.setLength(0);
                        inUnicode = false;
                        hadSlash = false;
                    } catch (NumberFormatException var9) {
                        throw new NestableRuntimeException("Unable to parse unicode value: " + unicode, var9);
                    }
                }
            } else if(hadSlash) {
                hadSlash = false;
                switch(ch) {
                    case ‘\"‘:
                        out.write(34);
                        break;
                    case ‘\‘‘:
                        out.write(39);
                        break;
                    case ‘\\‘:
                        out.write(92);
                        break;
                    case ‘b‘:
                        out.write(8);
                        break;
                    case ‘f‘:
                        out.write(12);
                        break;
                    case ‘n‘:
                        out.write(10);
                        break;
                    case ‘r‘:
                        out.write(13);
                        break;
                    case ‘t‘:
                        out.write(9);
                        break;
                    case ‘u‘:
                        inUnicode = true;
                        break;
                    default:
                        out.write(ch);
                }
            } else if(ch == 92) {
                hadSlash = true;
            } else {
                out.write(ch);
            }
        }

        if(hadSlash) {
            out.write(92);
        }

    }
}
时间: 2024-08-03 01:10:15

java中如何忽略字符串中的转义字符--转载的相关文章

判断java或js中的某个字符串中是否包含有某个字符或是字符串

js中: varCts = "aaddssyes"; if(Cts.indexOf("yes") > 0 ){     alert('Cts中包含Text字符串'); } 找的是最开始的位置,如果没找到,则返回的是-1. functionIndexDemo(str){    varstr1 = "BABEBIBOBUBABEBIBOBU"    vars = str1.indexOf(str);    return(s); } str是外边

Java 用正则表达式 截取字符串中的数字

package com.benywave; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { String str = "急救电话 112"; Pattern pattern = Pattern.compile("[0-9]{1,}"); Matcher matcher

java Map练习-获取字符串中字母出现次数(TreeMap实现)

/* 练习: "kbashbdjsgfwhofihbfkwejhfiubjzfhaads"获取该字符串中的字母出现次数. 希望打印结果:a(3)b(4)d(2)... 通过结果发现,每一个字母都有对应的次数.. 说明字符和次数之间都有映射关系. 注意:当发现有映射关系是,可以选择map集合. 因为map集合中存放的就是映射关系. 为什么使用map集合呢? 当数据之间存在着映射关系时,就想到了map集合. 思路: 1,利用String类的charAt()方法遍历字符串中的每一个字符. 2

Java脚本:去除字符串中空值

    /**      * @title 去除以','作为分隔符的字符串中的空值      *         从数据库中获取的个别字段,当其值为',"***","***"," ","***"'的时候,      *         可以通过该方法将其中的首分隔符和数据中为空的部分去除掉,      *         该字符串转化成正常的数据字符串' "***","***",&quo

使用java语言,将字符串中连续重复出现的字母变成“出现次数“+字母的格式

今天在简书上看到这样一道有趣的算法题: 解题思路 首先定义一个变量element,默认是字符串的第一个字符.以element为基准元素,去判断某个字符是否重复.然后再去定义一个变量count去记录重复的次数,初始值应该为1. 然后我们去遍历整个字符串,应该从第1号位置的字符开始遍历.如果当前字符等于element,就说明该字符在当前字符串中出现过,已经重复了.那么count就应该自增. 如果当前字符不等于element,就说明上一个字符连续的重复次数已经计算完毕,可以进行拼接操作.接下来我们就可

Excel中如何提取字符串中的数字

取字符串中的数字,假如数据在A列,提取公式为 =LOOKUP(9^9,--MID(A1,MIN(FIND({1,2,3,4,5,6,7,8,9,0},A1&5^19)),ROW($1:$99)))   如果字符串中只有汉字和数字,提取公式为 =MIDB(A1,SEARCHB("?",A1),2*LEN(A1)-LENB(A1))   还有一个强大的VLOOKUP函数,在此标记.

C#中如何在字符串中设置上标

一.HTML中:如字符串"21st" 想要把st 设置为上标,在html标签中是21<sup>st</sup> 二.C#编辑器中你可以使用 unicode super/subscripts,如: var o2 = "O?"; // or "O\x2082" var unit2 = "unit²"; // or "unit\xB2" 请参考以下网址中的表格:https://en.wik

C语言中指针和字符串中的一些小结

<pre name="code" class="objc"><span style="font-family: Arial, Helvetica, sans-serif;">void a_A(char *str){</span> for (int i =0; *(str+i) != '\0'; i++) { if (*(str+i) >= 'a' && *(str+i) <= 'z'

用JAVA写查询一个字符串中是否包含另外一个字符串以及出现的次数

package JAVA; import java.awt.List;import java.util.ArrayList;/** *  * @author 梁小鱼 * */public class MyTest { public static void main(String[] args) {  //查找字符串在目标字符串是否存在  Boolean isExit = IsExit("f","abfsdfsdkjl;fas;dlfsldf;asdfsdfaszdf"