Java中String.getBytes("windows-1251")返回字节数不符问题咨询
Java中String.getBytes("windows-1251")返回长度不符的原因
你遇到的问题核心是源代码文件编码与Java编译器读取编码不匹配,导致字符串在编译阶段就被错误解码,最终编码结果不符合预期。
问题拆解
- 你预期"Привет"是6个俄文字符,用windows-1251编码时每个字符占1字节,所以应该得到6字节数组。但实际得到12字节,且字节值是UTF-8编码俄文字符的结果(比如"П"的UTF-8是
0xd0 0x9f,而windows-1251中是0xcf)。 - 原因在于:你的IDE大概率把源代码文件保存为UTF-8编码,但Windows系统默认编码是windows-1251,
javac编译时默认用系统编码读取源代码。此时,UTF-8编码的"Привет"(12字节)被当成windows-1251字符解码,变成了12个乱码字符存入String对象。后续调用getBytes("windows-1251")时,是把这12个字符编码成windows-1251,自然得到12字节。
解决方案
方案1:统一源代码编码与编译编码
- 如果源代码保存为UTF-8,编译时指定编码参数:
javac -encoding UTF-8 Foo.java - 或者将源代码文件的编码改为windows-1251(在IDE的文件编码设置中调整),直接编译即可。
方案2:使用Unicode转义序列
避免在源代码中直接写非ASCII字符,改用Unicode转义表示俄文字符,这样不受源文件编码影响:
String s = "\u041F\u0440\u0438\u0432\u0435\u0442"; // 对应"Привет"
此时无论编译时用什么编码,String对象都会是正确的6个俄文字符,调用s.getBytes("windows-1251")会得到预期的6字节数组,字节值为0xcf、0xf0、0xe8、0xe2、0xe5、0xf2。
你的测试代码与结果
测试代码
import java.nio.charset.Charset; import java.io.*; import java.util.HexFormat; public class Foo { public static void main(String[] args) throws Exception { System.out.println(Charset.defaultCharset().displayName()); String s = "Привет"; System.out.println("bytes count in windows-1251: " + s.getBytes("windows-1251").length); printBytes(s.getBytes("windows-1251"), "windows-1251"); } public static void printBytes(byte[] array, String name) { for (int k = 0; k < array.length; k++) { System.out.println(name + "[" + k + "] = " + "0x" + byteToHex(array[k])); } } static public String byteToHex(byte b) { // Returns hex String representation of byte b char hexDigit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; char[] array = { hexDigit[(b >> 4) & 0x0f], hexDigit[b & 0x0f] }; return new String(array); } }
实际运行结果
windows-1251 bytes count in windows-1251: 12 windows-1251[0] = 0xd0 windows-1251[1] = 0x9f windows-1251[2] = 0xd1 windows-1251[3] = 0x80 windows-1251[4] = 0xd0 windows-1251[5] = 0xb8 windows-1251[6] = 0xd0 windows-1251[7] = 0xb2 windows-1251[8] = 0xd0 windows-1251[9] = 0xb5 windows-1251[10] = 0xd1 windows-1251[11] = 0x82
预期结果
windows-1251 bytes count in windows-1251: 6 windows-1251[0] = 0xcf windows-1251[1] = 0xf0 windows-1251[2] = 0xe8 windows-1251[3] = 0xe2 windows-1251[4] = 0xe5 windows-1251[5] = 0xf2
内容的提问来源于stack exchange,提问作者Ilyas
相关产品推荐
相关产品推荐

