Java字符串UTF-8将0xFF解码为0xC3BF

new*_*ekt 5 java string byte utf-8

我在使用 OutputStream 将某些字节写入文件时遇到了一个奇怪的问题。

该问题似乎是由数据“编码”引起的。

如果我明确写入输出流

saveFile.write(new byte[]{(byte)0xFF});
Run Code Online (Sandbox Code Playgroud)

它工作正常,我在十六进制编辑器中看到 0xFF。

但是当我尝试用字符串执行此操作时,它不起作用。例子:

scriptData = "some script data thats all text and stuff" + ((char)0xFF) + ((char)0x3B);
saveFile.write(scriptData.getBytes(Charset.forName("UTF-8")));
Run Code Online (Sandbox Code Playgroud)

在我的十六进制编辑器中,我看到文本,然后是 0xC3BF,然后是 0x3B。为什么0x3B正确写入文件但0xFF变成0xC3BF?

我还看到了另外一个线程,但它涉及 PrintStream,据我所知,我没有使用它。

将 0xFF 写入文件时出现问题

谢谢。

T.J*_*der 5

您要求的是字符 0xFF 的 UTF-8 等效值(非常明确)。字符 0xFF 在 UTF-8 中表示为两个字节:0xC3 和 0xBF。如果您不需要 UTF-8 编码,请不要使用getBytesUTF-8 编码。

请记住,UTF-8 不是单字节/字符编码。UTF-8(像所有 Unicode 转换一样)需要能够表示每个 Unicode 字符。这意味着 UTF-8 中的某些字符是一个字节长;其他的是两个字节长;还有一些是三个字节长,还有一些是四个字节长。