错误的字符集?Java程序从args[0]获取损坏的字符串
我在Windows10中运行java程序(defalt字符集:Big5)。 然后我从args[0]中获取了垃圾字符串 我发现使用任何类型的字符集都很难将损坏的字符串(args[0])转换为可读的字符串 IDE(UTF-8)-->JVM(UTF-8损坏的字符串)-->main(UTF-8损坏的字符串) UTF-8-->Big5 设定-->?定 我认为在将参数传递到JVM时,该参数已经损坏 eclipse运行配置中的参数错误的字符集?Java程序从args[0]获取损坏的字符串,java,utf-8,character-encoding,big5,gbk,Java,Utf 8,Character Encoding,Big5,Gbk,我在Windows10中运行java程序(defalt字符集:Big5)。 然后我从args[0]中获取了垃圾字符串 我发现使用任何类型的字符集都很难将损坏的字符串(args[0])转换为可读的字符串 IDE(UTF-8)-->JVM(UTF-8损坏的字符串)-->main(UTF-8损坏的字符串) UTF-8-->Big5 设定-->?定 我认为在将参数传递到JVM时,该参数已经损坏 eclipse运行配置中的参数 设定 -Dfile.encoding=UTF-8 eclipse运行配置中
设定
-Dfile.encoding=UTF-8
eclipse运行配置中的VM参数
设定
-Dfile.encoding=UTF-8
在eclipse运行配置中常见
编码:UTF-8
java源文件(CharsetARGTest.java)编码字符集:UTF-8
CharsetARGTest.java
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.nio.charset.Charset;
public class CharsetARGTest {
public static void main(String[] args) throws UnsupportedEncodingException {
// arg:
// IDE(UTF-8)-->???(Big5)-->JVM(damaged string)-->main(damaged string)
System.out.println("default charset:"+Charset.defaultCharset());
String str="设定";
System.out.println("String(UTF-8):"+str);
System.out.println("UTF-8 bytes:");
dump_bytes(str.getBytes("UTF-8"));
System.out.println("GBK bytes to String(GBK-->GBK):"+new String(str.getBytes("GBK"),"GBK"));
System.out.println("GBK bytes:");
dump_bytes(str.getBytes("GBK"));
System.out.println("UTF-8 bytes to String(UTF-8-->UTF-8):"+new String(str.getBytes(),"UTF-8"));
System.out.println("UTF-8 bytes:");
dump_bytes(str.getBytes());
System.out.println("Big5 bytes to String(Big5-->Big5):"+new String(str.getBytes("Big5"),"Big5"));
System.out.println("Big5 bytes:");
dump_bytes(str.getBytes("Big5"));
System.out.println("\n");
System.out.println("arg:"+args[0]);
System.out.println("Big5 bytes:");
dump_bytes(args[0].getBytes("Big5"));
System.out.println("UTF-8 bytes:");
dump_bytes(args[0].getBytes("UTF-8"));
}
static void dump_bytes(byte[] a) throws UnsupportedEncodingException {
for(byte c:a) {
System.out.print(c+" ");
}
System.out.print("\n");
}
static boolean bytesCompare(byte[] a, byte[] b) {
if (a.length != b.length)
return false;
for (int i = 0; i < a.length; i++) {
if (a[i] != b[i])
return false;
}
return true;
}
}
您是如何发现IDE和JVM之间的步骤的?>
?(Big5)
?只是猜测。我认为参数已损坏,因为参数在步骤中将UTF-8转换为Big5???(Big5)您可以看到Big5中的args[0]和Big5中的str是相同的。这并不意味着存在Big5字符集
,可能存在更多无法解码字符的字符集。另外,仅仅因为IDE和JVM之间的传输导致字符串损坏,并不意味着它们之间有额外的步骤。感谢您的描述。也许我应该更多地学习IDE和JVM。