如何在 Java 中将特定的字符集转换为 unicode?
字符集在这里已经讨论了很多,但我认为这个还没有被涵盖。
我有一个符合length%4==0
标准的十六进制字符串(例如 ud3faef8e
)。通常我只是在 HTML 容器中显示它,并在每个十六进制四元组的前面添加&#x
,;
添加到后面。
但在这种情况下,以下过程导致了正确的输出(非 Java)
- 将十六进制
- 字符串粘贴到十六进制编辑器中并将文件保存到
test.txt
(utf-8) - 使用记事本++打开文件
- 将编码更改为简体中文 (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,以便能够用我原来的方法 ( 폴
) 显示它,但我还没有找到再次获得十六进制值的方法(它们不符合标准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?