字符转Windows-1251编码结果异常,请求排查代码错误
问题分析与解决方案
嘿,我来帮你找出问题所在!这里有两个核心错误导致你得到了意外的E结果:
1. 编码转换逻辑完全搞反了
Java里的字符串本质是Unicode(UTF-16)编码的,你现在的代码逻辑完全走反了:
把Unicode字符串→转成UTF-8字节数组→再把这些字节当成Windows-1251编码解码回字符串
这就好比把“apple”的英文单词当成中文来读,结果肯定驴唇不对马嘴。
正确的编码转换逻辑应该是:
- 若要将Unicode字符串编码为指定编码的字节数组:
byte[] targetBytes = character.getBytes("目标编码"); - 若要将指定编码的字节数组解码为Unicode字符串:
String unicodeStr = new String(sourceBytes, "原编码");
2. Windows-1251编码根本不包含ł字符
ł是波兰语等拉丁系语言的专属字符,属于Latin-2(ISO-8859-2)字符集,而Windows-1251是专门为西里尔字母设计的编码——它的字符库里根本没有ł这个字符。哪怕你逻辑正确,尝试把ł转成Windows-1251编码时,JVM会自动把它替换成系统默认的替代字符(比如?或者你看到的E,具体取决于JVM的错误替换策略)。
修正后的代码示例
如果你的需求只是正确输出ł这个字符,建议直接用UTF-8编码输出(现在绝大多数终端都支持UTF-8):
String character = "ł"; try { // 直接打印字符串(如果终端默认UTF-8的话) System.out.println("character: " + character); // 或者明确指定输出流的编码,确保兼容性 System.setOut(new PrintStream(System.out, true, "UTF-8")); System.out.println("character with UTF-8 encoding: " + character); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
如果你的场景必须使用Windows-1251,那只能接受ł无法被表示的事实,或者换成支持该字符的编码(比如ISO-8859-2):
String character = "ł"; try { // 转成ISO-8859-2编码(该字符集包含ł) byte[] isoBytes = character.getBytes("ISO-8859-2"); String isoStr = new String(isoBytes, "ISO-8859-2"); System.out.println("character: " + isoStr); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者Despotars
相关产品推荐
相关产品推荐

