Java 转换编码
Java convert encoding
我有一个字符串,它曾经是一个包含 mojibakes 的 xml 标签:
<Applicant_Place_Born>Москва</Applicant_Place_Born>
我知道完全相同但编码正确的字符串是:
<Applicant_Place_Born>Москва</Applicant_Place_Born>
我知道这个是因为使用 Tcl 实用程序我可以将它转换成正确的字符串:
# The original string
set s "Москва"
# substituting the html escapes
set t "Ð\x9cоÑ\x81ква"
# decode from utf-8 into Unicode
encoding convertfrom utf-8 "Ð\x9cоÑ\x81ква"
Москва
我尝试了不同的变体:
System.out.println(new String(original.getBytes("UTF-8"), "CP1251"));
但我总是得到其他拼音符号或问号而不是字符。
问:除了使用 Java 代码外,我怎样才能像 Tcl 那样做?
编辑:
我试过@Joop Eggen 的方法:
import org.apache.commons.lang3.StringEscapeUtils;
public class s {
static String s;
public static void main(String[] args) {
try {
System.setProperty("file.encoding", "CP1251");
System.out.println("JVM encoding: " + System.getProperty("file.encoding"));
s = "Москва";
System.out.println("Original text: " + s);
s = StringEscapeUtils.unescapeHtml4(s);
byte[] b = s.getBytes(StandardCharsets.ISO_8859_1);
s = new String(b, "UTF-16BE");
System.out.println("Result: " + s);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
转换后的字符串是中文的:
JVM encoding: CP1251
Original text: Москва
Result: 킜킾톁킺킲킰
你们非常接近。但是,getBytes
用于 编码 UTF-8 而不是解码。你想要的是
String string = "Ð\x9cоÑ\x81ква";
byte[] bytes = string.getBytes("UTF-8");
System.out.println(new String(bytes, "UTF-8"));
java 中的字符串应该始终是正确的 Unicode。在您的情况下,您似乎将 UTF16BE 解释为某种单字节编码。
一个补丁会是
String string = new StringEscapeUtils().UnescapeHTML4(s);
byte[] b = string.getBytes(StandardCharsets.ISO_8859_1);
string = new String(b, "UTF-16BE");
现在 s
应该是一个正确的 Unicode 字符串。
System.out.println(s);
例如,如果操作系统是 Cp1251,则西里尔文字应正确转换。
- s中的字符我猜实际上是UTF-16BE的字节
- 通过以单字节编码获取字符串的字节,希望不会发生任何转换
- 然后创建一个 UTF-16BE 字节字符串,在内部转换为 Unicode(实际上也是 UTF-16BE)
我有一个字符串,它曾经是一个包含 mojibakes 的 xml 标签:
<Applicant_Place_Born>Москва</Applicant_Place_Born>
我知道完全相同但编码正确的字符串是:
<Applicant_Place_Born>Москва</Applicant_Place_Born>
我知道这个是因为使用 Tcl 实用程序我可以将它转换成正确的字符串:
# The original string
set s "Москва"
# substituting the html escapes
set t "Ð\x9cоÑ\x81ква"
# decode from utf-8 into Unicode
encoding convertfrom utf-8 "Ð\x9cоÑ\x81ква"
Москва
我尝试了不同的变体:
System.out.println(new String(original.getBytes("UTF-8"), "CP1251"));
但我总是得到其他拼音符号或问号而不是字符。
问:除了使用 Java 代码外,我怎样才能像 Tcl 那样做?
编辑:
我试过@Joop Eggen 的方法:
import org.apache.commons.lang3.StringEscapeUtils;
public class s {
static String s;
public static void main(String[] args) {
try {
System.setProperty("file.encoding", "CP1251");
System.out.println("JVM encoding: " + System.getProperty("file.encoding"));
s = "Москва";
System.out.println("Original text: " + s);
s = StringEscapeUtils.unescapeHtml4(s);
byte[] b = s.getBytes(StandardCharsets.ISO_8859_1);
s = new String(b, "UTF-16BE");
System.out.println("Result: " + s);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
转换后的字符串是中文的:
JVM encoding: CP1251
Original text: Москва
Result: 킜킾톁킺킲킰
你们非常接近。但是,getBytes
用于 编码 UTF-8 而不是解码。你想要的是
String string = "Ð\x9cоÑ\x81ква";
byte[] bytes = string.getBytes("UTF-8");
System.out.println(new String(bytes, "UTF-8"));
java 中的字符串应该始终是正确的 Unicode。在您的情况下,您似乎将 UTF16BE 解释为某种单字节编码。
一个补丁会是
String string = new StringEscapeUtils().UnescapeHTML4(s);
byte[] b = string.getBytes(StandardCharsets.ISO_8859_1);
string = new String(b, "UTF-16BE");
现在 s
应该是一个正确的 Unicode 字符串。
System.out.println(s);
例如,如果操作系统是 Cp1251,则西里尔文字应正确转换。
- s中的字符我猜实际上是UTF-16BE的字节
- 通过以单字节编码获取字符串的字节,希望不会发生任何转换
- 然后创建一个 UTF-16BE 字节字符串,在内部转换为 Unicode(实际上也是 UTF-16BE)