我有一个“ñ”字符的字符串,我有一些问题。我需要将这个字符串编码为UTF-8编码。我试过这种方法,但行不通:

byte ptext[] = myString.getBytes();
String value = new String(ptext, "UTF-8");

如何将该字符串编码为utf-8?


当前回答

在Java7中,你可以使用:

import static java.nio.charset.StandardCharsets.*;

byte[] ptext = myString.getBytes(ISO_8859_1); 
String value = new String(ptext, UTF_8); 

这比getBytes(String)有优势,它不声明抛出UnsupportedEncodingException。

如果你使用的是旧版本的Java,你可以自己声明字符集常量:

import java.nio.charset.Charset;

public class StandardCharsets {
    public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
    public static final Charset UTF_8 = Charset.forName("UTF-8");
    //....
}

其他回答

Java中的字符串对象使用不能修改的UTF-16编码*。

唯一可以有不同编码的是字节[]。因此,如果需要UTF-8数据,则需要一个字节[]。如果你有一个包含意外数据的字符串,那么问题是在之前的某个地方错误地将一些二进制数据转换为字符串(即它使用了错误的编码)。

*作为实现的问题,String可以在内部使用ISO-8859-1编码的字节[],当字符范围适合它时,但这是一个特定于实现的优化,对String的用户来说是不可见的(即你永远不会注意到,除非你深入源代码或使用反射深入String对象)。

怎么使用呢?

ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode(myString)
String value = new String(myString.getBytes("UTF-8"));

并且,如果您想从“ISO-8859-1”编码的文本文件中读取:

String line;
String f = "C:\\MyPath\\MyFile.txt";
try {
    BufferedReader br = Files.newBufferedReader(Paths.get(f), Charset.forName("ISO-8859-1"));
    while ((line = br.readLine()) != null) {
        System.out.println(new String(line.getBytes("UTF-8")));
    }
} catch (IOException ex) {
    //...
}

这解决了我的问题

    String inputText = "some text with escaped chars"
    InputStream is = new ByteArrayInputStream(inputText.getBytes("UTF-8"));

使用byte[] ptext = String.getBytes("UTF-8");而不是getBytes()。getBytes()使用所谓的“默认编码”,可能不是UTF-8。