java 什么是 utf?java使用unicode为默认编码是什么意思
很多朋友对于java 什么是 utf和java使用unicode为默认编码是什么意思不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
请问java默认的字符集是utf8是吗,那么下面这个
呃,以前没注意到呢。
java是定义了char为两个字节,同时String的实现也是用char数组的,这应该就是说String是两个字节字符构成的了。可是UTF8规定是英文字符一个字节,中文字符三个字节。这样貌似说java的字符村在内部是用UTF8编码的就貌似矛盾了。
在维基百科上有这么一段话:在通常用法下,Java程序语言在通过InputStreamReader和OutputStreamWriter读取和写入串的时候支持标准UTF-8。而没有说到java字符串到底是不是UTF8构成的。
同时我们知道java字面转义是\uxxxx的,也就是两个字节的,也就是两个字节确实可以编码所有字符才对。
补充:
好吧,差了资料,在类 Character的文档里面看到了这么些东西。
“char数据类型(和 Character对象封装的值)基于原始的 Unicode规范,将字符定义为固定宽度的 16位实体。Unicode标准曾做过修改,以允许那些其表示形式需要超过 16位的字符。合法代码点的范围现在是从 U+0000到 U+10FFFF,即通常所说的 Unicode标量值。”
嗯,也就是说Unicode原先是定义为2个字节的,但是后来改动了,进行了扩展。而java语言在定义的时候已经定义了char为2个字节,所以Unicode改了java却不能跟着把语言的基础也改了,所以又有——“从 U+0000到 U+FFFF的字符集有时也称为 Basic Multilingual Plane(BMP)。代码点大于 U+FFFF的字符称为增补字符。Java 2平台在 char数组以及 String和 StringBuffer类中使用 UTF-16表示形式。在这种表现形式中,增补字符表示为一对 char值,第一个值取自高代理项范围,即(\uD800-\uDBFF),第二个值取自低代理项范围,即(\uDC00-\uDFFF)。”也就是用两个char字符来表示一个Unicode值。
总的来说就是char还是两个字节的,但是在表示一些特殊字符的时候需要用到两个连续的char来表示,同时String通过保存了一个char序列来表示字符串。而String的getBytes("utf-8")获得的则是现在标准的UTF8编码字节序列,所以得到的是一个字母是一个字节,一个汉字是三个字节的结果。
哎~~也是乱七八糟的描述,鬼知道Unicode要变动呢这是。。
java如何把string转为utf-8
java不同编码之间进行转换,都需要使用unicode作为中转。
String str="任意字符串";
str= new String(str.getBytes("gbk"),"utf-8");
备注说明:
str.getBytes("UTF-8");意思是以UTF-8的编码取得字节
new String(XXX,"UTF-8");意思是以UTF-8的编码生成字符串
举例:
public static String getUTF8XMLString(String xml){
// A StringBuffer Object
StringBuffer sb= new StringBuffer();
sb.append(xml);
String xmString="";
String xmlUTF8="";
try{
xmString= new String(sb.toString().getBytes("UTF-8"));
xmlUTF8= URLEncoder.encode(xmString,"UTF-8");
System.out.println("utf-8编码:"+ xmlUTF8);
} catch(UnsupportedEncodingException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
// return to String Formed
return xmlUTF8;
扩展资料:
UTF-8编码规则:
如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。
实际表示ASCII字符的UNICODE字符,将会编码成1个字节,并且UTF-8表示与ASCII字符表示是一样的。所有其他的UNICODE字符转化成UTF-8将需要至少2个字节。每个字节由一个换码序列开始。第一个字节由唯一的换码序列,由n位连续的1加一位0组成,首字节连续的1的个数表示字符编码所需的字节数。
Unicode转换为UTF-8时,可以将Unicode二进制从低位往高位取出二进制数字,每次取6位,如上述的二进制就可以分别取出为如下示例所示的格式,前面按格式填补,不足8位用0填补。
参考资料来源:百度百科:UTF-8
java 中文乱码问题 utf-8和gbk的区别
这其中存在一个转换问题:
如System.out.println(new String("中国".getBytes("gbk"),"utf-8"));
System.out.println(new String("中国".getBytes("utf-8"),"gbk"));
//将“中国“的gbk编码格式按着utf-8解析,或者反过来都会出现乱码。
如浏览器当前为gbk编码,就以gbk编码格式来提交。这本身是不会出现乱码的,问题就出在Web服务器接收数据的时候,HttpServletRequest在将客户端传来的数据转成ucs2码上出了问题。在默认情况下,是按着iso-8859-1编码格式来转的,而这种编码格式并不支持中文,所以也就无法正常显示中文了,解决这个
问题的方法是用和客户端浏览器当前编码格式一致的编码来转换,如果是utf-8,则在doPost方法中应该用以下的语句来处理:
request.setCharacterEncoding("utf-8");
java使用unicode为默认编码是什么意思
java初学者都会接触到一个概念,既java的默认编码是uincode,但书上也就出现这句话而已,究竟是什么意思就没再说。其实对于一个程序员来说,一个平台的编码方式是不用了解的,因为这是他内部处理字符的方式,和我们顶层设计程序是没有多大关系(如果真要说有关系的话,一个就是你对这个平台的熟悉程度,另一个就只能是你要处理的字符奇葩到要考虑编译器有没有包括这个字符)。但这并不是指我们在编程的时候完全不用考虑编码问题,恰恰相反,编码问题是跨系统交流的基本。
那java哪里会用到编码问题呢?最常见的是流,下面有两个例子。1.在linux下用java创建了一个文件(这里默认代码里没有指定编码),里面包括英文和中文,然后在windows下同样用java读取这个文件,并输出,结果中文出现了乱码;2.android手机和电脑的两个java程序进行类似qq的信息交流,中文都是乱码。疑惑来了,java不是跨平台吗,而且默认编码就是unicode,为什么会有编码?正如上面所说,java的系统编码是管理内部变量等信息的,是统一不能变的,但上面两个例子出现乱码的原因在于这些字符信息是从外界读取的,编码方式直接影响到字符的显示,比如gbk一个字符是1或2个字节,中文是2个,而utf8是1到4个字节不定,中文是3个,utf16是2个字节固定不变,所以很明显了,同样字节数的源信息可以每2个或者每3个字节表达一个中文,不同编码当然不同了,而且即使gbk和utf16都是两个字节表示一个中文,同样的二进制也对应不同的字符。所以从外部读取到这些byte信息后,就要指定编码,比如new
String(byte[],charset),当然,也可以在构建流的时候就指定,像new
InputStreamReader(InputStream,charset)等,但像BufferedReader等没有相应的构造函数,就只能把上面的InputStreamReader作为参数了。
1.String和流(包括控制台的输出输入)的默认编码是根据系统而定,即jvm假设这些信息是当前系统创建的,windows默认中文是gbk,linux和mac是utf8(这里又来了,utf8和unicode是什么意思,简单地说,unicode是把每个字符和一个唯一的二进制码对应的标准,而utf是unicode
transformation
format,即如何表示每个唯一的二进制码,utf8,utf16和utf32是不同的编码方式);
2.IDE设置的编码方式用于存取java源文件,对于在不同系统平台上共享代码很重要;
3.java编译器采用utf8,即class文件的存储是用utf8,因为相对于utf16,utf8在处理英文占用内存小,而程序大部分都是英文;
4.jvm运行时的编码方式是utf16,即jvm用utf8从class文件读取程序后再转化为utf16编码的字符串,因为utf16是2个字节,统一的长度更方便jvm申请数组等操作;
5.网页大部分是用utf8编码的,在html头几行有charset的信息,在对下载下来的网页进行解析时,要注意编码,谷歌百度在对搜索结果的解析时也是用utf8的,所以在涉及到网络时编码问题非常重要,本人曾经栽得很惨,当然了,谁叫windows的编码不是utf8;
6.不知大家有没有经历过,如果编码弄错了,一般只有中文会出现乱码,而中文后面的英文是正确的,不合理啊,这不是类似多骨诺米牌吗,一个错了,后面不是全倒吗。所以别小看那些制定编码的专家,像utf8每个字节的前几位都用来表示一些信息,不同字节还不一样,而utf16也有,所以弄出了utf16le和utf16be
OK,关于java 什么是 utf和java使用unicode为默认编码是什么意思的内容到此结束了,希望对大家有所帮助。