java中如何忽略字符串中的轉義字符'\'

java中如何忽略字符串中的轉義字符''

##原由     這幾天工做上須要跟另外一個同事聯調rest接口,我這邊是java他是php,返回報文是json格式。接口調用成功後,輸出返回的報文中有相似「\u79fb\u52a8\u4e92\u8054\u7f51\u5e94\u7528 」的Unicode字符,有點納悶,記得java是會自動轉換Unicode字符爲中文才對。php

    經過斷點debug一看,發現返回的報文在程序中被轉換爲「\u79fb\u52a8\u4e92\u8054\u7f51\u5e94\u7528」,兩個反斜槓表示字符‘\’,因此輸出的不是Unicode對應的中文,而是「像Unicode」的字符串了。java

##解決方案     只要把獲得的報文中的「\」換成「\」,我想就能正常地將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("\\","\")天然沒效果了。apache

    後來在StackOverFlow上找到一個忽略轉義的工具類, org.apache.commons.lang.StringEscapeUtils ,裏面有忽略各類語言的轉義符號的方法,既好用也便於理解,就直接拿來用了。
其中unescapeJava(String s)方法是來處理java轉義字符的,能夠將字符串中的 「\」轉換爲 「\」,「'」轉換爲「'」等。經過這個方法處理以上字符串,恰好可以知足個人需求。json

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()方法處理轉義字符的相關源碼,便於理解。
```````````java
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);
		}

	}
}
相關文章
相關標籤/搜索