原文地址: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);
}
}
}
相关推荐
在Java编程语言中,分割字符串是一项常见的操作,它允许我们将一个长字符串分解成多个子字符串,每个子字符串对应原字符串中的某个部分。这通常通过使用`split()`方法来实现,该方法是Java `String`类的一个成员。在...
在Java编程语言中,"移动字符串"通常指的是在程序中动态改变字符串的显示位置或实现某种形式的动画效果。这通常涉及到字符数组、字符串对象、图形用户界面(GUI)组件或者控制台输出等方面的知识。下面将详细介绍...
Java中的转义字符是非常有用的工具,可以帮助程序员更灵活地处理各种字符和字符串。无论是处理文本数据还是格式化输出,了解并正确使用这些转义字符都是至关重要的。通过本文的介绍,相信读者已经对Java中的转义字符...
在Java编程中,字符和字符串是最常见的数据类型之一。为了方便高效地处理这些数据类型,Java提供了强大的支持,包括`Character`类和`String`类等。这些类位于`java.lang`包中,无需额外导入即可使用。 #### 二、...
### 常见转义字符在Java中的应用与...通过上述介绍,我们可以看出,Java中的转义字符为程序员提供了极大的便利,使得在处理字符串和其他文本数据时更加灵活高效。掌握这些转义字符对于编写高质量的Java程序至关重要。
以下是一些Java `String`类中常用的方法,这些方法对于理解和操作字符串至关重要。 1. **创建字符串** - `new String()`: 使用此构造函数创建一个新的字符串对象,可以传入字符数组或另一个字符串作为参数。 - `...
Java随机字符串生成器,可用于生成随机密码,加密算法密约(AES,RSA等)等场景,支持可选字符范围配置(如只允许数字,只允许字母,只允许数字字母,特殊字符等混合配置),即在选择的字符范围内去实现随机字符串...
### Java去除字符串中的空格、回车、换行符、制表符的知识点详解 #### 一、背景介绍 在日常的软件开发过程中,我们经常需要处理来自各种来源的文本数据,例如用户输入、文件读取等。这些数据中常常会包含空格、...
特殊字符是指在Java字符串中具有特殊含义的一些字符,它们可以用特定的转义序列来表示。 - `\"` 表示双引号字符`"`。 - `\'` 表示单引号字符`'`。 - `\\` 表示反斜杠字符`\`。 #### 四、控制字符 控制字符是在...
`replaceAll`函数就是Java(也是Android)中处理字符串替换的一个重要方法。这个方法来自`String`类,允许我们用新的字符串替换掉原字符串中匹配某个模式的所有实例。在这个案例中,我们要关注的是如何替换字符串中...
在Java编程语言中,转义字符是用于表示特殊符号或控制序列的一种方法。这些字符对于字符串处理、格式化输出以及处理特殊字符具有重要意义。本文将详细介绍Java中的常见转义字符及其用途。 ### 1. 基本转义字符 ###...
字符串的结束标志是\0的转义字符。在计算字符串空间长度的时候,\0作为结束标志,不算作字符串内容。 例如: 这时候我们发现空字符串的空间长度为1,原因是系统默认\0作为字符串的结束标志,不算作字符串内容,此时...
通过上述内容的介绍,我们可以看出Java中的转义字符非常实用且功能强大,能够帮助开发者处理各种字符串相关的任务。掌握这些转义字符不仅有助于编写更高效、更易维护的代码,还能提高开发效率和代码质量。希望本文能...
在Java编程语言中,转义字符是用于在字符串或字符字面量中表示特殊意义的字符。这些字符在源代码中以反斜线(\)开头,随后跟特定的序列,以便让编译器理解其真正的含义。以下是Java中转义字符的详细解释: 1. **八...
在“文件”下拉菜单中,选择“在工作区中搜索”,接着在“文件名”区域输入.java或.jsp,然后在“搜索”框中输入查询字符串。点击“搜索”按钮,结果会显示在侧边栏。 除了基本的搜索,这些IDE还提供了高级搜索选项...
去除长字符串中的转义字符,将其转换为没有转义字符的字符串,以及过长的字符串在idea中如何操作
字符串转HTML的16进制转义符 是转过来的,因为当初自己研究了挺久,觉得这个会在学习的过程中有帮助,就一起共享过来了。 不好意思,之前没写明是什么语言写的。 这里声明一下:Java 这里对没看清楚的兄弟说一声...
java实现含有英文字符串的符号替换为中文符号,在网上看了一些都没有详细的实现方式,看了这个就不用去摸索了,看了就会用了,下次有碰到这方面的,同样中文特殊符号转换为英文符号类似的逻辑
例如,我们需要将一个包含特殊字符的列表转换成JSON字符串。假设有一个简单的例子: ```java List<String> list = new ArrayList(); list.add("ƷƷ&"); list.add("Ʒ&"); ``` 在这个例子中,`"ƷƷ&"` 和 `"Ʒ&"`...
- **功能**:此函数用于准备字符串以安全地插入到MySQL数据库中,通过转义特殊字符来防止SQL注入。 - **语法**:`mysql_real_escape_string(string, connection)` - **参数**: - `string`:要转义的字符串。 -...