配置:Windows 8英文操作系统; JDK1.7;蚀。
我安装了一个由中文编写的软件,GUI是中文字符。但该软件显示方形框丑陋。我搜索了互联网并找到了解决问题的方法。在Win8的控制面板中,为非Unicode程序设置"语言"成为"中国"。
但是在Eclipse中编写代码时会出现问题。我们知道Java本身使用两个字节的Unicode来存储char
和String
。但是当我执行以下代码时:
import java.util.Arrays;
import java.nio.charset.Charset;
public class CharSetTest {
public static void main(String[] args) throws Exception {
System.out.println(Charset.defaultCharset());
String s = "哈哈";
byte[] b3 = s.getBytes("UTF-8");
System.out.println(b3.length);
System.out.format("%X %X %X\n", b3[0],b3[1],b3[2]);
System.out.println(new String(b3));
byte[] b4 = s.getBytes();
System.out.format("%X %X %X\n", b4[0],b4[1]);
}
}
输出很奇怪:
GBK //default charset is GBK, not Unicode or UTF-8
3 //this is obvious since a Chinese character is encoded into 3 bytes
E5 93 88 //this is corresponding UTF-8 code number
鍝? //something wrong here
B9 FE //I think s.getBytes() should use JAVA's default encode "Unicode", but NOT is this case
几个问题:
Charset.defaultCharset()
返回什么?它会返回我的Windows 8吗?
默认字符集?Charset.defaultCharset()
如何返回GBK?我没有在我的任何东西中设置任何东西
Windows 8相关的默认字符集,除了用于"语言的字符集
非Unicode程序"在控制面板中。String str = "abc";
,我就不会这样做
知道charset / encoding的过程。我首先需要输入
键盘的Java语句。键盘如何翻译我的键
按钮进入Java Unicode字符集? String str存储在我的
.java源代码文件。什么是存储Java源代码的charset
码? 修改:
为什么我们说" Java使用Unicode来表示char和String"?在我的Java程序中,我何时应该关心Unicode的事情?
通常,我只需要关心使用UTF-8 ISO-8859-1 GBK等编码/解码。但我从不关心char和String的Unicode表示。那么我应该如何以及何时使用Unicode? p>
答案 0 :(得分:2)
Check the doc:“默认字符集是在虚拟机启动期间确定的,通常取决于底层操作系统的区域设置和字符集。”所以不,默认字符集是不一定是Unicode。
在OpenJDK中,它是根据file.encoding
属性确定的。另见Setting the default Java character encoding?。
使用* GetUserDefaultLCID()函数获取默认file.encoding
值(在Windows上),该函数对应于“区域和语言选项”中的设置。这就是Charset.defaultCharset()
返回GBK的原因,因为您将语言环境设置为中文。
虽然默认字符集与操作系统相关,但编译的Java类中的字符串始终存储为UTF-16。
* .java源代码的编码是您为Java编译器指定的任何内容,如果未提供,则为OS的默认编码。请参阅Java compiler platform file encoding problem。
*:见http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/tip/src/windows/native/java/lang/java_props_md.c第577行。
答案 1 :(得分:1)
InputStreamReader
)。Charset.defaultCharset()
)。如果不明确指定它,那么Java将使用平台默认编码(参见#1)。答案 2 :(得分:0)
什么是JAVA默认字符集?
它是从您操作系统中的默认设置中选取的。这可能是Windows-1252 - ???
是Unicode吗?
这不是一个字符集。 charset定义了如何将字符编码为字节。
JAVA默认字符集如何与程序员交互?
这是您未指定字符集时使用的默认值。
例如,如果JAVA使用Unicode,则字符串“abc”不能编码到其他字符集中,因为它们与像俄罗斯,Frence等的字符集不同,因为它们是完全不同的编码方法。
内部Java使用UTF-16,但您不需要知道。除了一些中国方言需要使用代码点之外,大多数语言都没有问题。
Charset.defaultCharset()返回什么?
它做了它似乎做的事情。您可以通过阅读此方法的javadoc来确认这一点。
它是否返回我的WIN8默认字符集?
因为这是应该做的。如果操作系统的字符集无法映射到Java或未正确映射到Java,则只会出现问题。如果它是相同的,一切都很好。
Charset.defaultCharset()如何返回GBK。除了控制面板中“非Unicode程序的语言”之外,我没有在WIN8相关的默认字符集中设置任何内容。
这是因为Java认为你为Windows设置了这个。要更正此问题,您必须在Windows中具有正确的字符集。
如果我在java中声明一个String,如:String str =“abc”;,我不知道charset / encoding的过程。
就本问题而言,不涉及任何编码。只有字符不需要编码才能制作字符,因为它们已经是字符。
键盘如何将我的键按钮转换为Java Unicode字符集?
键盘没有。它只知道你按下了哪些键。操作系统将这些键转换为字符。
String str存储在我的.java源代码文件中。什么是存储java源代码的字符集?
这是由进行存储的编辑器决定的。很可能它将再次成为操作系统默认值,或者如果您更改它,可能会将其设为UTF-8。
答案 3 :(得分:0)
我不确定这是否有帮助。要在Eclipse中更改编码: --- Project Explorer ---右键单击Java文件 ---跑来跑去 ---运行配置 ---共同(标签) ---编码(在Linux中默认设置为UTF-8