【发布时间】:2011-09-04 17:36:10
【问题描述】:
这段代码有什么问题?我制作了一个 ISO8859 字符串。所以大部分ÄÖÜ都是一些krypooutput。没关系。但是如何将它们转换回普通字符(UTF8 之类的)?
String s = new String("Üü?öäABC".getBytes(), "ISO-8859-15");
System.out.println(s);
//ÃÃŒ?öÀABC => ok(?)
System.out.println(new String(s.getBytes(), "ISO-8859-15"));
//ÃÂÃÅ?öÃâ¬ABC => ok(?)
System.out.println(new String(s.getBytes(), "UTF-8"));
//ÃÃŒ?öÀABC => huh?
【问题讨论】:
-
假设“krypooutput”表示来自加密函数的输出,您为什么要尝试将其转换为“普通字符”。这是不安全的,因为它会导致数据丢失。如果您需要该数据的人类可读形式,请使用 hex-encoding 或 url-encoding。
-
Java 中没有“ISO8859 字符串”之类的东西。见balusc.blogspot.com/2009/05/…
-
那么如何将像“ÃŒ?öÀABC”这样的输入字符串转换为普通字符串? (如果我知道该字符串来自 ISO8859 文件)。
-
那么,你有一个IOS8859文件吗?然后你需要在从中读取字符串时指定编码,例如通过
InputStreamReader。 -
@Lissy:您遇到的第一个严重问题是您在 .java 源文件中使用了非 ASCII 字符,这是妄想。可悲的是,Java 没有指定其源代码文件的编码,如果您在 .java 源文件中使用非 ASCII 字符,您会发现一个很痛苦的世界。字符串应该被外部化,在 .java cmets 中使用非 ASCII 字符的 Java 程序员应该被枪杀。这在玩具环境中很好,您有一个开发人员在一个操作系统上使用一个 IDE 和一个 VCS,但是一旦您混合开发人员,您就会发现痛苦。外化你的字符串。
标签: java string unicode character-encoding