0

如何在 Java 中将特定字符集转换为 unicode?

字符集在这里已经讨论了很多,但我认为这个还没有被覆盖。

我有一个符合标准的十六进制字符串length%4==0(例如\ud3faef8e)。通常我只是在 HTML 容器中显示它并添加&#x到每个十六进制四元组的前面和;后面。

但在这种情况下,以下过程导致正确的输出(非Java)

  1. 将十六进制字符串粘贴到 Hex-Editor 并将文件保存到test.txt(utf-8)
  2. 用记事本++打开文件
  3. 将编码更改为简体中文(GB2312)

现在我正在尝试在 Java 中做同样的事情。

// having hex convert to ascii
String ascii = "";
for (int cnt = 0; cnt <= unicode.length() - 2; cnt += 2) {
  String tmp = unicode.substring(cnt, cnt + 2);
  int decimal = Integer.parseInt(tmp, 16);
  ascii += (char) decimal;
}
// writing ascii to file at this point leads to the same result as in step 2 before
try {
  // get the bytes
  byte[] utf8 = ascii.getBytes("UTF-8"); // == UTF8
  // convert to gb2312
  String converted = new String(utf8, "GB2312"); // == EUC_CN
  // write to file (writer with declared UTF-8)
  writeToFile(converted, 20 + cntu);
  cntu++;
} catch (Exception e) {
  System.err.println(e.getMessage());
}

输出看起来根据应该输出,除了随机显示以下字符的事实: 为什么会出现这个?我怎样才能摆脱它?

最后,我想得到的是再次转换后的unicode,以便能够用我原来的方法(&#xd3f4;)显示它,但我还没有找到再次获取十六进制值的方法(他们没有符合条件length%4==0)。如何获取字符的十六进制值?

更新1

更准确地说,关于输入,我假设它是 Unicode,因为字符串的开头是\u,这对于我通常的方法来说已经足够了,但在我上面描述的情况下则不然。

更新2

writeToFile 方法

FileOutputStream fos = new FileOutputStream("test" + id + ".txt");
Writer out = new OutputStreamWriter(fos, "UTF8");
out.write(str);
out.close();

我也试过了GB2312,但没有任何变化。我仍然得到? 在正确的字符之间。

更新3

预期的输出\ud3f6ef8e是遇飵,按照步骤 1 到 3 即可得到。(以 HxD 作为十六进制编辑器的示例)

4

1 回答 1

0

没有迹象表明我应该删除我的问题,因此我正在写我的最终评论作为答案

我误解了传入的十六进制数字。它们在特定的字符集中而不是 uni-code,因此它们表示该字符集中字符的十六进制值。我现在正在做的事情是新的String(byteArray, "CharsetName");,可以(int)s.charAt(i)获取 unicode 值并将其写入 HTML。感谢您的想法和提示

有关更多详细信息,请参见此处的答案:https ://stackoverflow.com/a/4049781/1338732 ,以及此处的问题:How to convert UTF-8 to unicode in Java?

于 2013-09-22T13:23:41.253 回答