【问题标题】:Converting windows-1252 Java [closed]转换 windows-1252 Java [关闭]
【发布时间】:2016-02-05 11:28:53
【问题描述】:

我有一个带有这个值的 java 字符串:

=C3=A1 =C3=A0 =C3=A7 =C3=A3 =C3=B5 =C3=A9 =C3=9A =C3=81 =C3=A2 =C3=A9 UHA a=C3==A7=C3=A3

我认为这是用 windows-1252 编码的。我想将其转换为可读的字符串。我尝试使用 UTF-8 进行转换,但它无法正常工作。有人可以帮助我吗?

【问题讨论】:

  • 你从哪里得到那个字符串?看起来根本不像是 UTF 问题。
  • 我尝试了stackoverflow.com/questions/23082522/…,但对我不起作用。
  • 我是从 C++ 服务器获取的。我提出了一个请求,服务器返回了那个字符串。
  • @brunoroberto 该 c++ 服务器的文档是怎么说的?它应该记录它返回的内容,以便其他人可以使用它,否则它只是一个膨胀的镇纸。

标签: java character-encoding


【解决方案1】:

字符串包含编码为Quoted-Printable的字符。

=C3=A1 部分是编码为 UTF-8 的á

小sn-p显示解码。

String hexChars = "0123456789ABCDEF";
String s = "=C3=A1 =C3=A0 =C3=A7 =C3=A3 =C3=B5 =C3=A9 =C3=9A"
        + " =C3=81 =C3=A2 =C3=A9 UHA a=C3=A7=C3=A3";
int stringIndex = 0;
int bytesIndex = 0;
byte[] bytes = new byte[s.length()];
while (stringIndex < s.length()) {
    if (s.charAt(stringIndex) == '=' 
            && hexChars.indexOf(s.charAt(stringIndex+1)) >= 0
            && hexChars.indexOf(s.charAt(stringIndex+2)) >= 0
            ) {
        int hex = hexChars.indexOf(s.charAt(stringIndex+1));
        hex <<= 4;
        hex += hexChars.indexOf(s.charAt(stringIndex+2));
        bytes[bytesIndex] = (byte) hex;
        stringIndex += 2;
    } else {
        bytes[bytesIndex] = (byte) (s.charAt(stringIndex) & 0XFF);
    }
    stringIndex++;
    bytesIndex++;
}
System.out.println("bytes = " + new String(bytes, 0, bytesIndex, 
        StandardCharsets.UTF_8));

输出

bytes = á à ç ã õ é Ú Á â é UHA açã

sn-p 仅用于演示目的。寻找一个为您解码quoted-printable 的库。

【讨论】:

  • 你的字节数组有尾随零字节,因为字节数据的长度比字符串的长度短。你应该使用new String(bytes, 0, bytesIndex, StandardCharsets.UTF_8)
  • 成功了,谢谢!唯一的问题是字母“ç”不起作用,但谢谢!
  • @VGR 你说得对。即使代码仅用于演示目的,也不应该有这样的错误。感谢您的评论。代码已相应更改。
猜你喜欢
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2011-05-20
  • 2019-08-19
相关资源
最近更新 更多