自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JAVA里字符編碼的探索與理解

開發(fā) 后端
今天終于把JAVA里一個(gè)比較頭痛的問題——字符編碼弄清晰了,所以寫一篇文章來紀(jì)念一下,也為大家提供一點(diǎn)自己的心得。

今天終于把JAVA里一個(gè)比較頭痛的問題——字符編碼弄清晰了,所以寫一篇文章來紀(jì)念一下,也為大家提供一點(diǎn)自己的心得。

眾所周知,JAVA為了國(guó)際通用,用的是UNICODE來保存里面的字符。而UNICODE只是一個(gè)種字符集,字符的存儲(chǔ)和表示要用到一定的字符編碼格式,而與UNICODE對(duì)應(yīng)的字符編碼格式就是我們??吹降腢TF-8,UTF-16等等,而UTF-8是最常用的,所以人們常常把它和UNICODE等同起來(我以前就是這樣的),這在某些情況下是沒有錯(cuò)的,但這樣的理解在JAVA里就會(huì)產(chǎn)生一些混淆。我們用下面的程序來演示一下。

定義一個(gè)字符串

String name = "堂";

這個(gè)字符串就一個(gè)字符,把它取出來

char c_name = name.charAt(0);

JAVA里的char型是十六位的(兩個(gè)字節(jié)),但是如果是用UTF-8的話可能會(huì)不只兩位(UTF-8是變長(zhǎng)存儲(chǔ)的),那看來JAVA本身并不是用UTF-8來保存的,口說無憑,做個(gè)實(shí)驗(yàn)吧。

首先看看char里保存的內(nèi)容  

 

int low = (c_name) & 0xff;//取c_name的低位
  int high = (c_name >> 8) & 0xff;//取c_name的高位
  System.out.println(Integer.toHexString(high) + " " + Integer.toHexString(low));

  

結(jié)果是58 02

只有兩個(gè)字節(jié)而已(16位),那么真正的UTF-8編碼的內(nèi)容是什么呢,再看看吧。

為了方便,我寫了一個(gè)輔助方法printbyte,作用是把一個(gè)byte數(shù)組的每個(gè)元素按照十六進(jìn)制格式打印出來,同樣為了方便,我把它作為靜態(tài)方法?!?/P>

 

#p#

 public static void printbyte(byte[] bt)
  {
  for (int i = 0; i < bt.length; i++)
  {
  int hex = (int)bt[i] & 0xff;
  System.out.print(Integer.toHexString(hex) + " ");
  }
  System.out.println(" length = "+bt.length);
  }
  byte[] utf_8 = name.getBytes("utf-8");
  printbyte(utf_8);

 

結(jié)果是e5 a0 82 length = 3

哇,三個(gè)字節(jié)!看來JAVA內(nèi)部用的真不是UTF-8,那用的是什么呢?UTF-16?看一下便知?! ?

byte[] utf_16 = name.getBytes("utf-16");
  printbyte(utf_16);

 

結(jié)果是fe ff 58 02 length = 4,靠,四個(gè)字節(jié)了。咦?后面的低16位不正是和開始c_name的十六進(jìn)制表示一樣的嗎?看來JAVA真正的內(nèi)部字符編碼和UTF-16有或多或少的聯(lián)系。JAVA內(nèi)部究竟是用的什么字符編碼呢?這個(gè)問題我也找了很久,后來在THINK IN JAVA 3rd的12章里看到一個(gè)例子出現(xiàn)了UTF-16BE,難道是它?  

byte[] utf_16be = name.getBytes("utf-16be");
  printbyte(utf_16be);
  結(jié)果出來了:58 02 length = 2

 

哈哈,I got it!不多不少兩個(gè)字節(jié),內(nèi)容也一樣。果然是它。同時(shí)我在里面也看到,UNICODE的編碼還有一個(gè)LE,這里的BE,LE我想應(yīng)該是bigendian和littleendian吧。

【編輯推薦】

  1. 如何在PHP中使用正則表達(dá)式
  2. Java正則表達(dá)式應(yīng)用詳解
  3. Java正則表達(dá)式初學(xué)者使用法簡(jiǎn)介
責(zé)任編輯:龐桂玉 來源: CSDN
相關(guān)推薦

2018-01-22 17:02:48

Python字符編碼ASCII

2009-12-24 17:16:23

Ado Oledb

2022-02-15 10:11:18

二進(jìn)制匯編代碼函數(shù)調(diào)用

2011-04-07 16:23:09

Web網(wǎng)頁(yè)設(shè)計(jì)編碼

2024-03-04 11:10:01

2011-12-16 16:02:42

Java

2024-12-05 12:01:09

2009-06-08 19:52:47

Eclipse字符編碼

2015-05-14 15:38:40

javajava內(nèi)存泄露

2011-11-17 13:59:41

Java內(nèi)存管理內(nèi)存泄露

2011-02-24 09:27:00

Java字符集編碼

2023-04-13 00:24:00

前端編碼JavaScrip

2010-10-08 09:51:52

Mysql設(shè)置字符

2022-05-18 10:56:58

Java字符串編碼

2009-06-11 17:31:27

Java泛型

2023-11-08 09:49:19

Java實(shí)踐

2009-06-16 11:32:00

Java泛型

2017-09-23 15:28:32

JavaOptional方法

2010-03-12 08:55:06

Java內(nèi)省反射

2018-02-26 16:07:48

Android3DDepth
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)