java的字符集
⑴ java中字符集什么意思
Java 中字符串在内核中使用 Unicode,也就是说每个字符 JVM 只记录它的 Unicode Code Point,只有在网络传输或保存到磁盘上时才需要把它转换成特定的字符集的编码,这个字符集就是把一个 Unicode Code Point 整数翻译成一串 byte[],因为在网络或磁盘上,字节是一个一个排列的,我们需要知道把高位字节排前面还是排后面并且容易推断出哪个哪个字节是一个字符的边界,这样才能把相关的几个字节还原成一个字符而不是把第2个字符的后面半数字节和第3个字符的前面半数的字节拼在一起出一个怪异的字符,我们以前在早期的电脑游戏中不支持双字节汉语时我们经常碰到这个问题,那就是先输入一个汉字,在内存中有2个字节,然后我们按一下 backspace 软件只删除一个字节,我们再输入一个汉字之后一共有3个字节的,这时我们用一个支持汉字的软件来查看这个文字可能是第1个剩下的字节和后面的字符的第1字节拼起来刚好又是另一个汉字,而剩下的第3个字节就不是有意义的绘图符号。
当不需要把 JVM 内存中的字符传输到网络外或磁盘上或打印出来的时候,我们是不需要知道字符集的,在显示在图形界面上时JVM知道怎么把它们显示出来,现在的 Windows 操作系统同样也是 Unicode 内核的,也就是说我们只要说明 Unicode Code Point 它应该知道是什么字符,那么只剩下字体这边是否也是用 Unicode Code Point 来对应一个字符啦(这个我不确定,但估计也是),如果操作系统和字符这边也是按 Unicode Code Point 来对应,那么当我们不保存到磁盘或发送出网络时是完全不需要知道有字符集这回事的。
下面这个例子中处理一个 Unicode 6.0 新标准中收录的汉字,你看到 UTF-8, UTF-16, GB18030 支持它们,但 GB2312 没有收录这个汉字,所以出个问号,也就是我们学说的乱码啦。
什么是 Unicode,下面这样的表格就是 Unicode,而那些坐标数字就是 Code Point.
⑵ Java: 如何知道一个字符串当前是什么字符集
判断java字符串的字符集有多种方法,我们一一讨论如下:
1、通过把未知编码字符串,用猜想的编码再解码,观察字符串是不是正确还原了。
原理:假如目标编码没有数组中的字符,那么编码会破坏,无法还原。
缺点:假如字符少,而正巧错误的猜想编码中有这种字节,就会出错。
如:new String("tested str".getBytes("enc"),"enc")
2、大多数时候,我们只要判断本地平台编码和utf8,utf8编码相当有规律,所以可以分析是否是utf8,否则使用本地编码。
原理:分析byte[]来判断规律。
缺点:有时,个别本地编码字节在utf8中也会出现,导致出错,需要分析。
如:判断是否utf-8代码:
public static boolean isValidUtf8(byte[] b,int aMaxCount){
int lLen=b.length,lCharCount=0;
for(int i=0;i
byte lByte=b[i++];//to fast operation, ++ now, ready for the following for(;;)
if(lByte>=0) continue;//>=0 is normal ascii
if(lByte<(byte)0xc0 || lByte>(byte)0xfd) return false;
int lCount=lByte>(byte)0xfc?5:lByte>(byte)0xf8?4
:lByte>(byte)0xf0?3:lByte>(byte)0xe0?2:1;
if(i+lCount>lLen) return false;
for(int j=0;j=(byte)0xc0) return false;
}
return true;
}
3.按编码规则,一字字比照。
优点是错物更少,缺点是太费资源。
⑶ Java中如何查看字符串是什么字符集
判断java字符串的字符集有多种方法,我们一一讨论如下:
1、通过把未知编码字符串,用猜想的编码再解码,观察字符串是不是正确还原了。
原理:假如目标编码没有数组中的字符,那么编码会破坏,无法还原。
缺点:假如字符少,而正巧错误的猜想编码中有这种字节,就会出错。
如:new String("tested str".getBytes("enc"),"enc")
2、大多数时候,我们只要判断本地平台编码和utf8,utf8编码相当有规律,所以可以分析是否是utf8,否则使用本地编码。
原理:分析byte[]来判断规律。
缺点:有时,个别本地编码字节在utf8中也会出现,导致出错,需要分析。
如:判断是否utf-8代码:
public static boolean isValidUtf8(byte[] b,int aMaxCount){
int lLen=b.length,lCharCount=0;
for(int i=0;i
byte lByte=b[i++];//to fast operation, ++ now, ready for the following for(;;)
if(lByte>=0) continue;//>=0 is normal ascii
if(lByte<(byte)0xc0 || lByte>(byte)0xfd) return false;
int lCount=lByte>(byte)0xfc?5:lByte>(byte)0xf8?4
:lByte>(byte)0xf0?3:lByte>(byte)0xe0?2:1;
if(i+lCount>lLen) return false;
for(int j=0;j=(byte)0xc0) return false;
}
return true;
⑷ Java语言使用的是Unicode字符集,每个字符在内存中占8位。请问是对还是错
这句话是错的,Unicode字符集每个字符在内存里占2byte,也就是16位(bit)
⑸ Java为什么选择unicode字符集
java中的字符就是指char类型的变量,无论中文还是英文,都是占2个字节,因为都是用Unicode编码,一个Unicode编码就是16位,也就是2个字节。
所以
char a='中';
char b='e';
都是合法的
substring 处理的最小单元就是一个字符,也就是一个char类型,2个字节
⑹ java以二进制传输字符集填啥
用UTF-8.
java读写文件的有很多种方式,基本都是采用java.io的inputStream和各种基于inputstream的封装实现对文件的读写,最原始的接口提供的便是基于byte的读写,而String可以看做是char[],一个char是8个byte。在最原始的ASCII编码中,我们采用一个字节 也就时8位来表示一个字符(图形字符或者控制字符),而后来1个字节不足以表示现实中的所有字符,于是出现了各种各样的编码格式,常见的比如UTF-8,GBK,UNICODE等。java中的string也是遵循jre中定义的默认字符集(基本为UTF-8),而在byte[]转化成String的过程中可能会由于编码字符集问题导致String逆向回来的byte[]与原来的数组不一致。
⑺ java输入输出流字符集怎么设
1. InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象,
2. Reader和 Writer.两个是为字符流(一个字符占两个字节)设计的,主要用来处理字符或字符串.
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点
所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列
1,字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
2,字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以
字节流是最基本的,所有的InputStrem和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的 但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化 这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联 在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的.
⑻ Java中字符集有哪些呢
字符集(character set)是一个系统支持的所有抽象字符的集合。字符(character)就是各种文字和符号,包括国家文字、标点符号、图形符号、数字等。
如果仅仅是抽象的字符集,其实是顾名思义的,但是我们常说的字符集,其实是指编码字符集(coded character set),比如: Unicode、ASCII、GB2312、GBK等等。什么是编码字符集呢?编码字符集是指,这个字符集里的每一个字符,都对应到唯一的一个代码值,这些代码值叫做代码点(code point),可以看做是这个字符在编码字符集里的序号,字符在给定的编码方式下的二进制比特序列称为代码单元(code unit)。在Unicode字符集中,字母A对应的数值是十六进制下的0041,书写时前面加U+,所以Unicode里A的代码点是U+0041。
常见的编码字符集有:
Unicode:也叫统一字符集,它包含了几乎世界上所有的已经发现且需要使用的字符(如中文、日文、英文、德文等)。
ASCII:早期的计算机系统只能处理英文,所以ASCII也就成为了计算机的缺省字符集,包含了英文所需要的所有字符。
GB2312:中文字符集,包含ASCII字符集。ASCII部分用单字节表示,剩余部分用双字节表示。
GBK:GB2312的扩展,完整包含了GB2312的所有内容。
GB18030:GBK字符集的超集,常叫大汉字字符集,也叫CJK(Chinese,Japanese,Korea)字符集,包含了中、日、韩三国语言中的所有字符。
学习相关java类知识,推荐来北京尚学堂,优秀的师资和科学的授课方式,会带给你完美的学习体验。
⑼ Java中的字符采用的是两个字节编码的什么字符集。
java平台采用UTF-16(Unicode)编码,一个字符占2个字节(不论英文,还是中文字符)。