有谁知道如何将字符串从ISO-8859-1转换为UTF-8并重新转换为Java?
我从网上获取一个字符串并将其保存在RMS(J2ME)中,但是我想保留特殊字符并从RMS中获取字符串,但要使用ISO-8859-1编码。我该怎么做呢?
Answers:
通常,您无法执行此操作。UTF-8能够编码任何Unicode代码点。ISO-8859-1只能处理其中的一小部分。因此,从ISO-8859-1转换为UTF-8没问题。如果发现不支持的字符,则从UTF-8退回到ISO-8859-1将导致“替换字符”( )出现在文本中。
转码文字:
byte[] latin1 = ...
byte[] utf8 = new String(latin1, "ISO-8859-1").getBytes("UTF-8");
要么
byte[] utf8 = ...
byte[] latin1 = new String(utf8, "UTF-8").getBytes("ISO-8859-1");
您可以使用较低级别的Charset
API进行更多控制。例如,您可以在发现无法编码的字符时引发异常,或者将其他字符用于替换文本。
There are hundreds of traditional encodings which can only store some code points correctly and change all the other code points into question marks. Some popular encodings of English text are Windows-1252 (the Windows 9x standard for Western European languages) and ISO-8859-1, aka Latin-1 (also useful for any Western European language). But try to store Russian or Hebrew letters [or special chars] in these encodings and you get a bunch of question marks. UTF 7, 8, 16, and 32 all have the nice property of being able to store any code point correctly.
对我 有用的:(“üzümbağları”是土耳其语中正确的文字)
将ISO-8859-1转换为UTF-8:
String encodedWithISO88591 = "üzüm baÄları";
String decodedToUTF8 = new String(encodedWithISO88591.getBytes("ISO-8859-1"), "UTF-8");
//Result, decodedToUTF8 --> "üzüm bağları"
将UTF-8转换为ISO-8859-1
String encodedWithUTF8 = "üzüm bağları";
String decodedToISO88591 = new String(encodedWithUTF8.getBytes("UTF-8"), "ISO-8859-1");
//Result, decodedToISO88591 --> "üzüm baÄları"
String a=new String(encodedWithUTF8.getBytes("ISO88591"), "ISO-8859-1")
和String b=new String(encodedWithUTF8.getBytes("ISO88591"), "UTF-8")
?如果字符串采用一种编码方式,而我们使用另一种编码方式获得字节,那么幕后情况是什么?
a
将采取UTF-8
的字节,将它们转换成ISO
字节,然后使用一个表bytes->chars
的ISO
编码打印串出。如果是字符串b
,它将使用一个表bytes->chars
,UTF-8
因此ISO
根据UTF
规则在本质上映射了字节。 a
即使是,也可以将OK打印出来ISO
,因为Java不会弄乱它在内部存储的字节。b
可能会损坏,因为某些ISO
字符将被打印出来,就像它们属于UTF
编码一样。
如果您有String
,则可以执行以下操作:
String s = "test";
try {
s.getBytes("UTF-8");
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
如果你有一个“破” String
,你做错了什么,转换String
到String
另一种编码defenetely不是要走的路!您可以将a转换String
为a byte[]
,反之亦然(给定编码)。在JavaString
中,AFAIK编码有,UTF-16
但这是实现细节。
假设你有一个InputStream
,你可以在阅读byte[]
,然后将其转换成一个String
使用
byte[] bs = ...;
String s;
try {
s = new String(bs, encoding);
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
甚至更好(由于埃里克森)使用InputStreamReader
如下:
InputStreamReader isr;
try {
isr = new InputStreamReader(inputStream, encoding);
} catch(UnsupportedEncodingException uee) {
uee.printStackTrace();
}
这是使用String输出的简单方法(我创建了一个方法来执行此操作):
public static String (String input){
String output = "";
try {
/* From ISO-8859-1 to UTF-8 */
output = new String(input.getBytes("ISO-8859-1"), "UTF-8");
/* From UTF-8 to ISO-8859-1 */
output = new String(input.getBytes("UTF-8"), "ISO-8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return output;
}
// Example
input = "Música";
output = "Música";
正则表达式也可以很好并且可以有效地使用(替换未ISO-8859-1
用空格覆盖的所有UTF-8字符):
String input = "€Tes¶ti©ng [§] al€l o€f i¶t _ - À ÆÑ with some 9umbers as"
+ " w2921**#$%!@# well Ü, or ü, is a chaŒracte⚽";
String output = input.replaceAll("[^\\u0020-\\u007e\\u00a0-\\u00ff]", " ");
System.out.println("Input = " + input);
System.out.println("Output = " + output);
Apache Commons IO Charsets类可以派上用场:
String utf8String = new String(org.apache.commons.io.Charsets.ISO_8859_1.encode(latinString).array())
这是将UNICODE(ISO_8859_1)转换为UTF-8的函数
public static String String_ISO_8859_1To_UTF_8(String strISO_8859_1) {
final StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < strISO_8859_1.length(); i++) {
final char ch = strISO_8859_1.charAt(i);
if (ch <= 127)
{
stringBuilder.append(ch);
}
else
{
stringBuilder.append(String.format("%02x", (int)ch));
}
}
String s = stringBuilder.toString();
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
String strUTF_8 =new String(data, StandardCharsets.UTF_8);
return strUTF_8;
}
测试
String strA_ISO_8859_1_i = new String("الغلاف".getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
System.out.println("ISO_8859_1 strA est = "+ strA_ISO_8859_1_i + "\n String_ISO_8859_1To_UTF_8 = " + String_ISO_8859_1To_UTF_8(strA_ISO_8859_1_i));
结果
ISO_8859_1策略=اÙغÙاÙString_ISO_8859_1To_UTF_8 =الغلاف
将ISO-8859-1字符串转换为UTF-8字符串的最简单方法。
private static String convertIsoToUTF8(String example) throws UnsupportedEncodingException {
return new String(example.getBytes("ISO-8859-1"), "utf-8");
}
如果要将UTF-8字符串转换为ISO-8859-1字符串。
private static String convertUTF8ToISO(String example) throws UnsupportedEncodingException {
return new String(example.getBytes("utf-8"), "ISO-8859-1");
}
此外,一种无需使用String类的构造函数即可将ISO-8859-1字符串转换为UTF-8字符串的方法。
public static String convertISO_to_UTF8_personal(String strISO_8859_1) {
String res = "";
int i = 0;
for (i = 0; i < strISO_8859_1.length() - 1; i++) {
char ch = strISO_8859_1.charAt(i);
char chNext = strISO_8859_1.charAt(i + 1);
if (ch <= 127) {
res += ch;
} else if (ch == 194 && chNext >= 128 && chNext <= 191) {
res += chNext;
} else if(ch == 195 && chNext >= 128 && chNext <= 191){
int resNum = chNext + 64;
res += (char) resNum;
} else if(ch == 194){
res += (char) 173;
} else if(ch == 195){
res += (char) 224;
}
}
char ch = strISO_8859_1.charAt(i);
if (ch <= 127 ){
res += ch;
}
return res;
}
}
该方法基于将该网站的utf-8编码为iso-8859-1。 将utf-8编码为iso-8859-1