`
bugyun
  • 浏览: 556373 次
社区版块
存档分类
最新评论

java忽略字符串中的转义字符

    博客分类:
  • Java
 
阅读更多

转自:http://my.oschina.net/u/1010578/blog/366252

java中如何忽略字符串中的转义字符''(转)

起因

    这几天工作上需要跟另一个同事联调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);
        }

    }
}
分享到:
评论

相关推荐

    java处理字符和字符串课件

    在Java编程中,字符和字符串是最常见的数据类型之一。为了方便高效地处理这些数据类型,Java提供了强大的支持,包括`Character`类和`String`类等。这些类位于`java.lang`包中,无需额外导入即可使用。 #### 二、...

    Java 字符串常用方法

    以下是一些Java `String`类中常用的方法,这些方法对于理解和操作字符串至关重要。 1. **创建字符串** - `new String()`: 使用此构造函数创建一个新的字符串对象,可以传入字符数组或另一个字符串作为参数。 - `...

    以任意指定的字符分割一个字符串,然后保存在字符串数组中

    在实际应用中,你可能会遇到更复杂的场景,比如处理多字符分隔符、忽略空格、处理转义字符等,这些都是在字符串处理时需要考虑的问题。通过熟悉这些基础知识,你可以更有效地处理各种字符串处理任务。

    JAVA字符串中所用的方法.rar

    在Java编程语言中,字符串(String)是至关重要的数据类型,被广泛用于各种应用程序。字符串是不可变的对象,意味着一旦创建,其内容就不能更改。在Java中,字符串处理涉及到多个方法,这些方法允许我们进行字符串的...

    Mybatis在Mapper.xml文件中的转义字符处理方式.pdf

    为了解决这个问题,Mybatis提供了一些处理转义字符的方式,以确保SQL语句能够正确地写入Mapper.xml文件中并被解析。 在Mapper.xml文件中处理转义字符的常见方法主要有以下几种: 1. 常用的XML转义字符写法 在XML中...

    在整个项目中查询字符串.doc

    在“文件”下拉菜单中,选择“在工作区中搜索”,接着在“文件名”区域输入.java或.jsp,然后在“搜索”框中输入查询字符串。点击“搜索”按钮,结果会显示在侧边栏。 除了基本的搜索,这些IDE还提供了高级搜索选项...

    常用字符串操作的实现方式

    七、字符串转义 1、 转义特殊字符:String escaped = StringEscapeUtils.escapeJava("Hello\nWorld"); 输出结果:"Hello\\nWorld" 2、 反转义:String unescaped = StringEscapeUtils.unescapeJava(escaped); 输出...

    StringUtils 字符串常用工具

    在Java编程语言中,`StringUtils` 是一个非常实用的工具类,它提供了大量关于字符串操作的方法,极大地简化了对字符串的处理。这个类通常在处理字符串时提高代码的可读性和效率,尤其在处理字符串的空值、拼接、分割...

    浅谈MySQL模糊查询中通配符的转义

    如果我们想要模糊查询带有通配符的字符串,如“60%”,“user_name”,就需要对通配符进行转义,有两种方式。如下:   1、反斜杠是转义符,通过反斜杠来转义%,使其不再是通配符。这里第一个%是通配符,第二个%不是...

    直接截取jstl长度控制字符串长短

    -- 使用fn:containsIgnoreCase忽略大小写判断字符串中是否包含另一个字符串 --&gt; ${fn:containsIgnoreCase('这是一个TeSt', 'test')}"&gt; 字符串中包含"test" (忽略大小写) &lt;!-- 使用fn:toLowerCase将字符串转换为...

    Python字符串特性及常用字符串方法的简单笔记

    此外,可以通过前缀`r`来创建原始字符串,忽略所有转义字符,如: ```python path = r'C:\some\name' ``` **1.2 多行字符串** 使用三引号(单引号或双引号均可)可以创建多行字符串,例如: ```python multi_...

    jstl 字符串处理函数

    此函数用于将字符串中的特殊字符转义为XML兼容字符,比如将小于号(&lt;)转为&lt;。 使用示例: ```jsp ${fn:escapeXml(param:info)} ``` 4. indexOf 这个函数返回子字符串在母字符串中首次出现的位置索引,如果未...

    很好用的JAVA类转JSON工具:FastJSON (2).pdf

    需要注意的是,JSON字符串中的双引号在Java字符串中需要转义,所以`"Bi\"ao"`实际上代表`"Biao"`。 FastJSON还支持更复杂的转换,例如处理数组、集合、Map等数据结构,以及自定义序列化和反序列化的逻辑。对于...

    教你如何完全理解转义符号

    在程序设计中,转义符号(或称为转义字符)是一种特殊的字符序列,用于在文本字符串中表示那些具有特定含义或者需要特殊处理的字符。转义符号主要用于解决字符在编程语言中的特殊意义问题,确保代码能够正确地被解释...

    JAVA_split_用法

    在Java编程语言中,`String`类提供了多个实用的方法来处理字符串,其中`split()`方法是用于将一个字符串分割成字符串数组的一种常见方式。此方法利用正则表达式(Regular Expression)作为分隔符来分割字符串,并...

    JavaCC词法分析器 单词定义超详细 基于Eclipse插件 能从文件读取源代码 输出种别编码和对应单词

    - 处理转义字符和特殊序列,如在字符串常量中的`\n`。 一旦词法分析器定义完成,JavaCC会自动生成相应的Java源代码,包含一个解析器类和相关的辅助类。这些生成的代码可以与你的应用程序集成,处理用户输入或读取...

    Java正则表达式入门及用法

    1. **转义字符**:Java中有一些预定义的转义字符: - `\b`:表示单词边界。 - `\B`:表示非单词边界。 - `\d`:等同于`[0-9]`,用于匹配任何数字。 - `\D`:等同于`[^0-9]`,用于匹配任何非数字。 - `\s`:等同...

    xml转javaBean,javaBean转xml,xml标签大小写问题,以及对xml特殊符号的处理

    通过调用Marshaller的marshal()方法,我们可以将JavaBean对象转换为XML字符串或者写入XML文件。 3. XML标签大小写问题: XML是大小写敏感的,这意味着“element”和“Element”被视为不同的元素。在定义XML Schema...

    蓝桥杯省赛无忧班(Java 组) - 带源码课件.7z

    在Java编程中,需要编写算法来找到给定字符串中的最长镜像子串。这是一个字符串处理的问题,涉及到字符串遍历、子串提取和比较的算法实现。 4. 源码变换与HTML转义:由于HTML的特殊字符和格式要求,直接在HTML文档...

Global site tag (gtag.js) - Google Analytics