在 Java 中将字符集 X 转换为 unicode



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

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

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

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

    将十六进制
  1. 字符串粘贴到十六进制编辑器中并将文件保存到 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

写到文件方法

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

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

更新3

ud3f6ef8e的预期输出是遇飵,您可以在执行步骤 1 到 3 时到达它。(HxD 作为十六进制编辑器的示例)

没有

迹象表明我应该删除我的问题,因此我写下了最后的评论作为答案

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

有关更多详细信息,请参阅此处的答案: https://stackoverflow.com/a/4049781/1338732 ,以及此处的问题: 如何在 Java 中将 UTF-8 转换为 unicode?

最新更新