# 字节编码和字符串

> 原文： [https://docs.oracle.com/javase/tutorial/i18n/text/string.html](https://docs.oracle.com/javase/tutorial/i18n/text/string.html)

如果字节数组包含非 Unicode 文本，则可以使用`String`构造函数方法之一将文本转换为 Unicode。相反，您可以使用`String.getBytes`方法将`String`对象转换为非 Unicode 字符的字节数组。调用这些方法之一时，请将编码标识符指定为其中一个参数。

下面的示例将转换 UTF-8 和 Unicode 之间的字符。 UTF-8 是 Unicode 的传输格式，对 UNIX 文件系统是安全的。该示例的完整源代码位于文件 [`StringConverter.java`](examples/StringConverter.java) 中。

`StringConverter`程序首先创建一个包含 Unicode 字符的`String`：

```
String original = new String("A" + "\u00ea" + "\u00f1" + "\u00fc" + "C");

```

打印时，名为`original`的`String`显示为：

```
AêñüC

```

要将`String`对象转换为 UTF-8，请调用`getBytes`方法并将相应的编码标识符指定为参数。 `getBytes`方法返回 UTF-8 格式的字节数组。要从非 Unicode 字节数组创建`String`对象，请使用 encoding 参数调用`String`构造函数。如果不支持指定的编码，则进行这些调用的代码将包含在`try`块中：

```
try {
    byte[] utf8Bytes = original.getBytes("UTF8");
    byte[] defaultBytes = original.getBytes();

    String roundTrip = new String(utf8Bytes, "UTF8");
    System.out.println("roundTrip = " + roundTrip);
    System.out.println();
    printBytes(utf8Bytes, "utf8Bytes");
    System.out.println();
    printBytes(defaultBytes, "defaultBytes");
} 
catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}

```

`StringConverter`程序打印出`utf8Bytes`和`defaultBytes`数组中的值以说明重要的一点：转换后的文本的长度可能与源文本的长度不同。一些 Unicode 字符转换为单个字节，其他字符转换为成对或三字节字节。

`printBytes`方法通过调用`byteToHex`方法显示字节数组，该方法在源文件 [`UnicodeFormatter.java`](examples/UnicodeFormatter.java) 中定义。这是`printBytes`方法：

```
public static void printBytes(byte[] array, String name) {
    for (int k = 0; k < array.length; k++) {
        System.out.println(name + "[" + k + "] = " + "0x" +
            UnicodeFormatter.byteToHex(array[k]));
    }
}

```

`printBytes`方法的输出如下。请注意，在两个数组中，只有第一个和最后一个字节 A 和 C 字符相同：

```
utf8Bytes[0] = 0x41
utf8Bytes[1] = 0xc3
utf8Bytes[2] = 0xaa
utf8Bytes[3] = 0xc3
utf8Bytes[4] = 0xb1
utf8Bytes[5] = 0xc3
utf8Bytes[6] = 0xbc
utf8Bytes[7] = 0x43
defaultBytes[0] = 0x41
defaultBytes[1] = 0xea
defaultBytes[2] = 0xf1
defaultBytes[3] = 0xfc
defaultBytes[4] = 0x43

```