2

在我以以下方法返回字符串之前,我想将内容转换为 utf-8 字符集:

public static String getContentResult(URL url) throws IOException{
    InputStream in = url.openStream();
    StringBuilder sb = new StringBuilder();

    byte [] buffer = new byte[4096];

    while(true){
        int byteRead = in.read(buffer);
        if(byteRead == -1)
            break;
        for(int i = 0; i < byteRead; i++){
            sb.append((char)buffer[i]);
        }
    }
    in.close();
    return sb.toString();
}

我怎样才能做到这一点?

谢谢!

4

3 回答 3

3

您不想转换UTF-8。您希望(我相信)将传入的数据流解释UTF-8。

选项:

  • 创建一个InputStreamReader包装您的传入流,指定 UTF-8,并一次读取字符块,附加到StringBuilder

    StringBuilder builder = new StringBuilder();
    char[] buffer = new char[4096];
    InputStreamReader reader = new InputStreamReader(in, "UTF-8");
    int charsRead;
    while ((charsRead = reader.read(buffer)) != -1) {
        builder.append(buffer, 0, charsRead);
    }
    
  • 使用Guava将整个数据读取为字节数组,然后一次性转换:

    byte[] data = BytesStreams.toByteArray(in);
    return new String(data, Charsets.UTF_8);
    

在任何一种情况下,您都应该使用一个finally块来关闭流,这样即使抛出异常也可以关闭它。

于 2012-11-28T10:07:58.140 回答
0

从字符串转换为字节[]:

String s = "some text here";
byte[] b = s.getBytes("UTF-8");

从 byte[] 转换为 String:

byte[] b = {(byte) 99, (byte)97, (byte)116};
String s = new String(b, "US-ASCII");
于 2012-11-28T10:06:59.730 回答
-1

如果要添加实际字节值,请不要使用“US-ASCII”,只需关闭该参数即可:

byte[] abcd={'A','B','C','D',13,10,'E','F',(byte)255,'G','H',13,10,'J','K',0,'L','M'};
String s = new String(abcd);
StringBuilder sabcd=new StringBuilder();

sabcd.append(s);
System.out.println(sabcd);
for(int i=0;i<sabcd.length();i++) {
    char c=sabcd.charAt(i);
    System.out.println((int)c);
}

结果:

ABCD
EFÿGH
JK
65
66
67
68
13
10
69
70
255
71
72
13
10
74
75
0
76
77
于 2018-04-20T18:47:42.120 回答