日期:2014-05-18  浏览次数:20706 次

(期望加精)有关字符编码的问题,求解?
近日在看jsp字符编码的问题时,有几点思考不通,

以下是我的理解,请高手解惑,

所谓的各种编码也不过是 “把字符和01对应的规则”
我知道ASCII码是用7位二进制来表示128个字符,一个字节8位,用一个字节就可表示ASCII码表(最高位不用),也很容易理解如果计算机内存中有一字节内容为: 01000001, 采用ASCII编码的话, 通过查ACSII表,知道它代表字符'A';
对于一门语言,它采用的编码是固定的??
对于计算机本身而言(脱离任何语言),我们在键盘上按下字符A,则在文本编辑器中可以看到出现一个字符A,这个过程包含基本的输入,输出处理,这一过程是基本的输入输出程序提供的(由操作系统负责调度)?, 和基本的机型有关,; 那它一定也采用了一种编码方式,因为这一过程也包含了编码解码的过程, 我的问题来了:
1.那对于一般的计算机而言,它通常采用的是哪种编码方式?

2.而对于一门语言,如果它和计算机基本的编码不同(比如java,它采用的是unicode码),那是否也有个编码转化的过程? 在哪一阶段转化,编译期?



------解决方案--------------------
不错,有自己的想法

楼主可以参考我的这个博客

"Java字符编码转换"
------解决方案--------------------
字符编码,就我得理解,字符编码其实就可以去简单理解,比如JAVA是用unicode,C++用ASCII编码,这就导致了各种数据类型占用的字节数不一样,C++ 中char占用1个字节,java占用2个字节,编码得不一样,本质上就是因为存储方式得不一样
------解决方案--------------------
第一个问题:C++和C 语言的编码默认采用的是本地的。Java采用的Unicode
第二个问题:Java举例:你在String str = "码";时应该是从本地读取一串二进制数据,这串二进制数据在本地系统所采用的那种编码中 
对应的是“码”,Java语言读到这串二进制数据,比如说是0xdddd;会把它转换另一串二进制数据,假如是0xdfdd,这串二进
制数据在Unicode中对应的"码"。这种转换应该是本地系统采用的编码和Unicode编码之间的转换规则。
System.out.println(str);就是反过来。

如有错误,恳请指正。


------解决方案--------------------
了解字符编码确实很重要,我之前有研究过一段时间,大家可以参考博客:

.Net与字符编码(理论篇)
http://www.cnblogs.com/baoquan/archive/2007/12/04/981721.html
------解决方案--------------------
1.那对于一般的计算机而言,它通常采用的是哪种编码方式? 
这个问题应该问:《那对于一般的“操作系统”而言,它通常采用的是哪种编码方式?》
(而不是计算机,计算机是个抽象的概念)
答:一般操作系统是采用“本地编码”。所谓本地编码是操作系统根据具体的国家语种而定的。
例如:简体中文的操作系统一般采用GBK编码,繁体中文一般采用Big5编码。


2.而对于一门语言,如果它和计算机基本的编码不同(比如java,它采用的是unicode码),那是否也有个编码转化的过程? 在哪一阶段转化,编译期? 
答:对于一门语言说其内部最好还是采用一种编码方式来表示字符,这样会显得更方便(例如:Java内部只采用unicode编码)
Java的字节码文件(即:*.class)是由Java源代码(即:*.java),经由Java编译器编译后得到的。
一个Java源文件(*.java)有其特定的编码类型。例如:GBK编码。(即:简体中文系统默认的编码)
那么我们在编译Java源文件(*.java)的时候,要指明你的源文件(*.java)
采用的是哪种编码方式。例如:javac -encoding GBK Test.java 
这样做的原因是要让Java编译器能够按照正确的编码方式去理解你的Java源文件,从而将其转化为字节码文件(*.class)
Java程序中的字节码都是Unicode码,当用javac编译原文件时就涉及到一个编码转换的过程,javac编译时可以指定源文件的实际编码: 
即:javac -encoding "GBK" Test.java 
这样告诉javac,源文件是GBK编码,如果不写-encoding参数,则用操作系统默认的编码。 
这就为什么我们“一般”在简体中文操作系统下,编写的Java源文件的时候,直接采用javac Test.java来编译Java文件。
------解决方案--------------------
这个破编码问题,这么麻烦吗?
1 计算机只能识别单个的字节,占8位,当然你理解成8位的二进制数也行
2 这样只能处理256个字符
3 所以每个国家就自己制定了自己国家文字的编码方式,比如中国的GBK,用2个字节表示一个汉字。
4 某些标准化组织,为了统一标准,就出现了统一编码,把大部分文字都纳入考虑范围。汉字在里面也是2个字节的。
5 而UTF-8则采用3个自己标识汉字。

6 JAVA语言的内部,只有unicode编码

所以,任何的输入和输出,都可能发生转换。 因为同一个汉字编码不同,一旦搞错了就出现乱码了。






------解决方案--------------------
1)计算机默认编码:

高手们回答的很正确,可本人总觉得与其说计算机默认编码到不如说是IDE默认编码。这应该是两个问题,可实际中IDE的问题更多。

2)而对于一门语言,如果它和计算机基本的编码不同(比如java,它采用的是unicode码),那是否也有个编码转化的过程? 在哪一阶段转化,编译期?


我觉得是不是每一个时期采用的默认编码是不一样的?比如定义
String s = "abc";
byte[] len =s.getBytes();

那他还会转成unicode占用六个字节吗?答案显然不是这样的。好像是你得明文写成s.getBytes("unicode"),他才会是一个六字节数组。

不知道我理解的是否正确,请高手们指正。
------解决方案--------------------
我觉得是不是每一个时期采用的默认编码是不一样的?比如定义 
String s = "abc"; 
byte[] len =s.getBytes(); 

那他还会转成unicode占用六个字节吗?答案显然不是这样的。好像是你得明文写成s.getBytes("unicode"),他才会是一个六字节数组。 

不知道我理解的是否正确,请高手们指正。
------解决方案--------------------