在我们的程序中,我们需要将编码为253的字符转换为String。正确的结果应该是“ý”。
代码是这样的:
byte[] valueMarkByteArr = {(byte)253};
valueMark = new String(valueMarkByteArr, "ISO-8859-1");
这在我的Windows框中运行良好。但是当代码部署到在Linux上运行的服务器时,valueMark的结果是“ý”。这完全打破了我们的计划! “ý”是一个双字符串!
我尝试了很多不同的方法(例如String.valueOf((char)253) 或者Character.toString((char)253)),结果是一样的。 首先,是什么影响了结果字符串并使它们在这两台不同的机器之间有所不同?如何在Linux平台上出现正确的字符串“ý”?
BTW,在Windows机器上,java -version显示:在Linux机器上,它是:
openjdk版本“1.8.0_131”
OpenJDK运行时环境(版本1.8.0_131-b11)
OpenJDK 64位服务器VM(内置25.131-b11,混合模式)
我还编写了以下程序来测试不同的机器。 Linux机器给出了相同的错误结果。
import java.io.*;
public class TestAttrMark {
public static void main(String[] args) {
for (String s: args) {
try {
int argInt = Integer.parseInt(s);
byte argByte = (byte) argInt;
byte [] byteArr = new byte[] {argByte};
System.out.println();
System.out.println("argInt: " + argInt);
System.out.println("argByte: " + argByte + " or: 0x" + byteToHex(argByte));
System.out.println("In ISO-8859-1: " + new String(byteArr, "ISO-8859-1"));
System.out.println("In UTF8: " + new String(byteArr, "UTF8"));
System.out.println("In ASCII: " + new String(byteArr, "ASCII"));
System.out.println("In ISO8859_1: " + new String(byteArr, "ISO8859_1"));
System.out.println("In ISO8859_2: " + new String(byteArr, "ISO8859_2"));
System.out.println("In ISO8859_4: " + new String(byteArr, "ISO8859_4"));
System.out.println("In Cp437: " + new String(byteArr, "Cp437"));
System.out.println("In Cp850: " + new String(byteArr, "Cp850"));
System.out.println("In Cp852: " + new String(byteArr, "Cp852"));
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
private static String byteToHex(byte b) {
// Returns hex String representation of byte b
char hexDigit[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
char[] array = { hexDigit[(b >> 4) & 0x0f], hexDigit[b & 0x0f] };
return new String(array);
}
}
编译后,您可以使用以下命令运行: java -cp。 TestAttrMark 253
欢迎任何建议!谢谢!