java - 如何将 Cp1252 字节数组转换为正确的字符串?

标签 java encoding

大家好,代码如下:

File file2 = new File("D://deploy//body.txt");

byte[] bytes = loadFile(file2);
System.out.println(bytes.length);

StringBuffer buffer = new StringBuffer();
InputStream inputStream = new ByteArrayInputStream(bytes);
InputStreamReader reader = new InputStreamReader(inputStream,"CP1252");
Reader in = new BufferedReader(reader);
int ch;
while ((ch = in.read()) > -1) {
    buffer.append((char)ch);
}
in.close(); 
System.out.println(buffer.toString().getBytes().length);

最终结果是字节数组的长度为1576和2439。将 CP1252 字节数组转换为字符串并保留正确大小的正确方法是什么?谢谢

最佳答案

我注意到你的短语 - “正确的字符串”,并想指出在你的情况下不存在正确或不正确的字符串。这是正确或不正确的编码。

您正在读取 cp1252 字节的字节序列,并将各个字符附加到缓冲区中。如果原始文件在cp1252中,则此过程没有问题。在底层,InputStreamReader 使用 CharsetDecoder它能够将流的底层字符集解码为十六位 Unicode 字符 (UTF-16) 序列。这已经完成,因为您正在从字节流中读取字符。

As pointed out by bmargulies ,当您执行buffer.toString().getBytes()时您正在将这些 UTF-16 字符序列转换为与平台具有相同编码的字节序列。由于这不是 cp1252,因此原始字节数组和转换后的字节数组的长度不可比较。将字符集指定为 getBytes()方法导致使用 StringEncoder(这是 Oracle/Sun JVM 的内部类;其他实现可能使用不同的类)将 UTF-16 字符序列转换为所需编码 (cp1252) 中的字节序列。

关于java - 如何将 Cp1252 字节数组转换为正确的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6380459/

相关文章:

video - 如何将文本流(字幕)添加到 .mp4 或 .m4v

Apache 8.5 拒绝编码的 url

Java - 打印显示换行符的字符串

java - SCREEN_ON 和 SCREEN_OFF 的 BroadcastReceiver,即使在退出应用程序后也是如此

java - mediaCapture windows 8.1 winjs 应用程序

算法:按预期频率将符号压缩成位串?

Python:LookupError:未知编码:十六进制

java - 无法在 Spring Boot 测试中模拟persistenceContext

java - 如何保存和编码带有特殊字符的xml字符串?

java - 在 XML 文档中,是否可以区分实体编码的字符和非实体编码的字符?