windows-1252 转 UTF-8
windows-1252 to UTF-8
下面是我尝试使用的代码,它给我的输出是:
RetValue: á, é, í, ó, ú, ü, ñ, ¿ Value: á, é, í, ó, ú, ü, ñ, ¿ ConvertValue: ?, ?, ?, ?, ?, ?, ?, ?
这不是想要的输出。我认为这里的每个字符的输出都应该是这种类型的 %C3%。
public static void main(String[] args) {
String value = "á, é, í, ó, ú, ü, ñ, ¿";
String retValue = "";
String convertValue = "";
try {
retValue = new String(value.getBytes(),
Charset.forName("Windows-1252"));
convertValue = new String(retValue.getBytes("Windows-1252"),
Charset.forName("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("RetValue: " + retValue + " Value: " + value
+ " ConvertValue: " + convertValue);
}
我了解到您正在尝试将您的文本从默认编码编码为 Windows-1252,然后再编码为 UTF-8。
根据 String
class
的 javadoc
String(byte[] bytes, Charset charset)
Constructs a new String by decoding the specified array of bytes using the
specified charset.
因此,您所做的是将默认编码的文本解码为Windows-1252,然后将新获得的文本进一步解码为UTF-8。这就是它呈现异常的原因。
如果您的目的是将 Windows-1252 编码为 UTF-8,我建议您对 java.nio
包中的 CharsetEncoder
使用以下方法:
public static void main(String[] args) {
String value = "á, é, í, ó, ú, ü, ñ, ¿";
String retValue = "";
String convertValue2 = "";
ByteBuffer convertedBytes = null;
try {
CharsetEncoder encoder2 = Charset.forName("Windows-1252").newEncoder();
CharsetEncoder encoder3 = Charset.forName("UTF-8").newEncoder();
System.out.println("value = " + value);
assert encoder2.canEncode(value);
assert encoder3.canEncode(value);
ByteBuffer conv1Bytes = encoder2.encode(CharBuffer.wrap(value.toCharArray()));
retValue = new String(conv1Bytes.array(), Charset.forName("Windows-1252"));
System.out.println("retValue = " + retValue);
convertedBytes = encoder3.encode(CharBuffer.wrap(retValue.toCharArray()));
convertValue2 = new String(convertedBytes.array(), Charset.forName("UTF-8"));
System.out.println("convertedValue =" + convertValue2);
} catch (Exception e) {
e.printStackTrace();
}
}
我获得了以下输出:
value = á, é, í, ó, ú, ü, ñ, ¿
retValue = á, é, í, ó, ú, ü, ñ, ¿
convertedValue =á, é, í, ó, ú, ü, ñ, ¿
下面是我尝试使用的代码,它给我的输出是:
RetValue: á, é, í, ó, ú, ü, ñ, ¿ Value: á, é, í, ó, ú, ü, ñ, ¿ ConvertValue: ?, ?, ?, ?, ?, ?, ?, ?
这不是想要的输出。我认为这里的每个字符的输出都应该是这种类型的 %C3%。
public static void main(String[] args) {
String value = "á, é, í, ó, ú, ü, ñ, ¿";
String retValue = "";
String convertValue = "";
try {
retValue = new String(value.getBytes(),
Charset.forName("Windows-1252"));
convertValue = new String(retValue.getBytes("Windows-1252"),
Charset.forName("UTF-8"));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("RetValue: " + retValue + " Value: " + value
+ " ConvertValue: " + convertValue);
}
我了解到您正在尝试将您的文本从默认编码编码为 Windows-1252,然后再编码为 UTF-8。
根据 String
class
String(byte[] bytes, Charset charset)
Constructs a new String by decoding the specified array of bytes using the specified charset.
因此,您所做的是将默认编码的文本解码为Windows-1252,然后将新获得的文本进一步解码为UTF-8。这就是它呈现异常的原因。
如果您的目的是将 Windows-1252 编码为 UTF-8,我建议您对 java.nio
包中的 CharsetEncoder
使用以下方法:
public static void main(String[] args) {
String value = "á, é, í, ó, ú, ü, ñ, ¿";
String retValue = "";
String convertValue2 = "";
ByteBuffer convertedBytes = null;
try {
CharsetEncoder encoder2 = Charset.forName("Windows-1252").newEncoder();
CharsetEncoder encoder3 = Charset.forName("UTF-8").newEncoder();
System.out.println("value = " + value);
assert encoder2.canEncode(value);
assert encoder3.canEncode(value);
ByteBuffer conv1Bytes = encoder2.encode(CharBuffer.wrap(value.toCharArray()));
retValue = new String(conv1Bytes.array(), Charset.forName("Windows-1252"));
System.out.println("retValue = " + retValue);
convertedBytes = encoder3.encode(CharBuffer.wrap(retValue.toCharArray()));
convertValue2 = new String(convertedBytes.array(), Charset.forName("UTF-8"));
System.out.println("convertedValue =" + convertValue2);
} catch (Exception e) {
e.printStackTrace();
}
}
我获得了以下输出:
value = á, é, í, ó, ú, ü, ñ, ¿
retValue = á, é, í, ó, ú, ü, ñ, ¿
convertedValue =á, é, í, ó, ú, ü, ñ, ¿