2017-05-26 57 views

回答

0

使用JSON实用程序打印UTF-8代码点在Java中有点矫枉过正。

在Java8使用IntStream String.codePoints()

String text = "äh"; 
text.codePoints().forEach(c -> System.out.print("\\u" + String.format("%04Xh ", c))); 

在早期的Java版本(包括的Android SDK):

String text = "äh"; 
for(int i = 0; i < text.length(); i++) { 
    System.out.print("\\u" + String.format("%04Xh ", text.codePointAt(i))); 
} 

两个结果:

\u00E4h \u0068h 
+0

对不起库,忘了提,这是在Android上,因此没有Java 8 –

+0

这哪里是' \ u0068h'从哪里来? –

+0

'\ u00E4h'末尾的'h'是'h',是'äh'中的第二个字符,它不需要被编码为JSON编译器。 –

0

对于JSON,你需要将某些字符转义为unicode escap e序列(\u1234)。在大多数Java JSON库,这是这样做(从here拍摄):

/** 
* Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F). 
* @param s 
* @return 
*/ 
public static String escape(String s){ 
    if(s==null) 
     return null; 
    StringBuffer sb = new StringBuffer(); 
    escape(s, sb); 
    return sb.toString(); 
} 

/** 
* @param s - Must not be null. 
* @param sb 
*/ 
static void escape(String s, StringBuffer sb) { 
    for(int i=0;i<s.length();i++){ 
     char ch=s.charAt(i); 
     switch(ch){ 
     case '"': 
      sb.append("\\\""); 
      break; 
     case '\\': 
      sb.append("\\\\"); 
      break; 
     case '\b': 
      sb.append("\\b"); 
      break; 
     case '\f': 
      sb.append("\\f"); 
      break; 
     case '\n': 
      sb.append("\\n"); 
      break; 
     case '\r': 
      sb.append("\\r"); 
      break; 
     case '\t': 
      sb.append("\\t"); 
      break; 
     case '/': 
      sb.append("\\/"); 
      break; 
     default: 
      //Reference: http://www.unicode.org/versions/Unicode5.1.0/ 
      if((ch>='\u0000' && ch<='\u001F') || (ch>='\u007F' && ch<='\u009F') || (ch>='\u2000' && ch<='\u20FF')){ 
       String ss=Integer.toHexString(ch); 
       sb.append("\\u"); 
       for(int k=0;k<4-ss.length();k++){ 
        sb.append('0'); 
       } 
       sb.append(ss.toUpperCase()); 
      } 
      else{ 
       sb.append(ch); 
      } 
     } 
    }//for 
} 

至于我可以告诉上面的方法都无法逃脱你的ä字符,因为它并不需要进行转义,只要因为您正在使用UTF-8作为生成的JSON文本的编码,我想这是您想要发送到的地方。

因此,要么使用UTF-8作为您的内容编码,并且不要转义ä(不需要),或者修改上述方法以使用ch > 127转义所有内容。即:

[...] 
     default: 
      //Reference: http://www.unicode.org/versions/Unicode5.1.0/ 
      if((ch > 127) || (ch>='\u0000' && ch<='\u001F') || (ch>='\u007F' && ch<='\u009F') || (ch>='\u2000' && ch<='\u20FF')){ 
       String ss=Integer.toHexString(ch); 
       sb.append("\\u"); 
       for(int k=0;k<4-ss.length();k++){ 
        sb.append('0'); 
       } 
       sb.append(ss.toUpperCase()); 
      } 
      else{ 
       sb.append(ch); 
      } 
[...] 

然后它应该工作...