有没有一种方法可以指定字符编码到java.lang.StringBuilder?

10
或者我只能被困在这里:
String s = new String(new byte[0], Charset.forName("ISO-8859-1"));
// or ISO_8859_1, or LATIN-1 or ... still no constants for those
for (String string : strings) { // those are ISO-8959-1 encoded
    s += string; // hopefully this preserves the encoding (?)
}

1
从文件或流中写入或读取的文本是可以特定编码的。 - Hovercraft Full Of Eels
2个回答

16

在Java中,字符串始终采用UTF-16编码。它们只是char值的序列,这些值是UTF-16代码单元。当您在String(byte[], String)构造函数中指定编码时,它只是表示如何将字节解码成文本 - 编码随后被丢弃。

如果您需要保留编码,则需要创建自己的类来保存CharsetString。不过我从未想过要这样做 - 您真的确定需要吗?

(因此,您“卡住”的代码也无法正常工作 - 而且还会很低效。)


1
@HovercraftFullOfEels:最开始的“your”是正确的 - 问题中的代码“属于”提问者。在这种情况下,“you're”就不适用了。 - Jon Skeet
你的“卡住”的代码也不会起作用 - 而且还会很低效。这就是我说“卡住”的原因 - 感谢你的回答,我现在理解了! - Mr_and_Mrs_D
@Mr_and_Mrs_D:“还是我被卡住了”这句话让我觉得你有一段不喜欢的代码,但会绕过这个问题——在这种情况下,它将没有任何好处。不过很高兴你现在“搞定了” :) - Jon Skeet

2
使用带缓存的转换器如何呢:
public static void main(String args[]) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream(1<<10);
    OutputStreamWriter osw = null;
    try {
        osw = new OutputStreamWriter(baos, "UTF-8");
    } catch (UnsupportedEncodingException ex) {
    }
    osw.write("Привет!");
    osw.flush();
    System.out.println("Hello: " + baos.toString("UTF-8"));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接