You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中String.getBytes("windows-1251")返回字节数不符问题咨询

Java中String.getBytes("windows-1251")返回长度不符的原因

你遇到的问题核心是源代码文件编码与Java编译器读取编码不匹配,导致字符串在编译阶段就被错误解码,最终编码结果不符合预期。

问题拆解

  1. 你预期"Привет"是6个俄文字符,用windows-1251编码时每个字符占1字节,所以应该得到6字节数组。但实际得到12字节,且字节值是UTF-8编码俄文字符的结果(比如"П"的UTF-8是0xd0 0x9f,而windows-1251中是0xcf)。
  2. 原因在于:你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:04:57