最近项目设计到java项目与c项目基于tcp通讯的数据交互,在发送数据的过程当中由java发送数据给c项目,出现了乱码,完全学习了下字符串编码与文件编码之间的关系,关于编码的什么ASCII、UTF-8(Unicode的一种实现)、GBK之间的关系网上一搜一箩筐,不在详细阐述,能够参看这里。html
每一个项目都有工程编码,java工程能够项目->属性(properties)查看其编码,而咱们在写c项目的时候好像历来都没有注意这些。在vs2010默认的是ANSI(即GBK)的,CodeBlock默认的也是GBK。咱们先来看下c项目字符串的编码与文件编码的关系。java
使用CodeBlock建了两个c项目,一个编码是GBK的,一个是UTF-8,(CodeBlock项目编码设置setting->editor->other setting),使用相同的代码tcp
int main()
{
int i = 0;
char* str = "中文";
while(str[i++] != '\0')
{
printf("%0x\n",str[i]&0xFF);
}
printf("%s", str);
return 0;
}学习
打印"中文"在内存中的编码,在UTF的c项目中输出结果为:,用二进制文件查看其.c和.exe文件编码编码
能够看到.exe文件和.c中char* str都是UTF-8编码,与输出的字符串编码是一致的。spa
再来看GBK的c项目中的输出状况:,文件.c、.exe二进制编码状况:操作系统
那么能够确定:在c项目中,字符串的编码char* str与文件.c的编码是一致的,而文件的编码通常默认与项目编码一致。这里有必要就UTF-8项目输出的是乱码进行解释,由于win操做系统环境是中文GBK的,控制台默认输出的是GBK,因此当输出UTF-8的字符串时就出现了乱码。设计
----------------------------------------------------------------java分割线-------------------------------------------------------------------------------------------------------------------------3d
再来看java项目中.class与.java文件之间的编码关系,咱们先建一个GBK的java项目,代码以下:code
import java.io.UnsupportedEncodingException;
public class test {
public static void main(String[] args) {
String str = "中文";
try {
byte[] bs = str.getBytes("GBK");
for(int i = 0; i < bs.length; i++){
System.out.println(Integer.toHexString(bs[i]));
}
String str2 = new String(bs,"GBK");
System.out.println(str2);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
java对字符串的编码处理支持就好的多了,你能够获取任何本身想要字符编码,并指定其输出编码(通常编码用什么,解码就用什么)。在GBK的项目中.java文件用的是ANSI的存储方式,.class文件是以何种编码呢?GBK吗?,咱们来看下.java和.class文件的二进制:
String str在.java文件中是GBK存储,可是生成的二进制.class文件其编码倒是UTF-8的!!!也就是咱们说的java采用的是Unicode编码,在生成.class文件的时候编译器帮咱们把各类不一样编码的.java文件所有生成统一的Unicode编码的.class文件,那么在java平台全部字符在内存中的表示都是统一的(无论你的项目是什么编码,字符串内存表示都同样,与项目编码无关)。
至于UTF-8的java项目其.java和.class必定都是同样的编码。