java中如何忽略字符串中的转义字符--转载
原文地址:http://my.oschina.net/u/1010578/blog/366252
起因
????這幾天工作上需要跟另一個(gè)同事聯(lián)調(diào)rest接口,我這邊是java他是php,返回報(bào)文是json格式。接口調(diào)用成功后,輸出返回的報(bào)文中有類似“\u79fb\u52a8\u4e92\u8054\u7f51\u5e94\u7528 ”的Unicode字符,有點(diǎn)納悶,記得java是會(huì)自動(dòng)轉(zhuǎn)換Unicode字符為中文才對(duì)。
????通過(guò)斷點(diǎn)debug一看,發(fā)現(xiàn)返回的報(bào)文在程序中被轉(zhuǎn)換為“\u79fb\u52a8\u4e92\u8054\u7f51\u5e94\u7528”,兩個(gè)反斜杠表示字符‘\’,所以輸出的不是Unicode對(duì)應(yīng)的中文,而是“像Unicode”的字符串了。
解決方案
????只要把得到的報(bào)文中的“\”換成“\”,我想就能正常地將Unicode輸出成中文了,首先想到的是使用字符串的replaceAll()方法。使用replaceAll(“\\“,“\“),但是發(fā)現(xiàn)輸出結(jié)果沒(méi)有任何變化。?
查了下API文檔,replaceAll()方法的定義是:
????也就是第一個(gè)參數(shù)指的是正則表達(dá)式,所以“\\”用正則表達(dá)式的方式來(lái)看,匹配的是字符串中的兩個(gè)\字符,而不是java中的‘\’轉(zhuǎn)義符。換句話說(shuō),就是regex參數(shù)作為正則表達(dá)式查找的源字符串是已經(jīng)轉(zhuǎn)義過(guò)的“\u79fb\u52a8\u4e92\u8054\u7f51\u5e94\u7528”,而不是轉(zhuǎn)義前的“\\u79fb\\u52a8\\u4e92\\u8054\\u7f51\\u5e94\\u7528”,所以replaceAll(“\\“,“\“)自然沒(méi)效果了。
????后來(lái)在StackOverFlow上找到一個(gè)忽略轉(zhuǎn)義的工具類, org.apache.commons.lang.StringEscapeUtils ,里面有忽略各種語(yǔ)言的轉(zhuǎn)義符號(hào)的方法,既好用也便于理解,就直接拿來(lái)用了。?
其中unescapeJava(String s)方法是來(lái)處理java轉(zhuǎn)義字符的,可以將字符串中的 “\”轉(zhuǎn)換為 “\”,“'”轉(zhuǎn)換為“'”等。通過(guò)這個(gè)方法處理以上字符串,剛好能夠滿足我的需求。
????附上unescapeJava()方法處理轉(zhuǎn)義字符的相關(guān)源碼,便于理解。
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); } } }轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/4580786.html
總結(jié)
以上是生活随笔為你收集整理的java中如何忽略字符串中的转义字符--转载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Disruptor 源码阅读笔记--转
- 下一篇: The LMAX disruptor A