Java里的char類型能不能存儲一個(gè)中文字符文虏?

原文出處:?原文



對于這道題侣诺,絕大多數(shù)的答案都是“可以存儲”。給出的原因包括:

1. java中的char是unicode存儲氧秘,unicode編碼字符集中包含了漢字年鸳,所以可以存儲中文;

2. java內(nèi)部其實(shí)是使用的UTF-16的編碼丸相,所以是支持大部分非生僻漢字的搔确;

3. 采用Unicode編碼集,一個(gè)char占用兩個(gè)字節(jié)灭忠,而一個(gè)中文字符也是兩個(gè)字節(jié)膳算,因此Java中的char是可以表示一個(gè)中文字符的;

4. Java的char只能表示utf-16中的BMP部分中文字符弛作,不能表示擴(kuò)展字符集里的中文字符涕蜂;


原文地址:https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html

char類型是按照Unicode規(guī)范實(shí)現(xiàn)的一種數(shù)據(jù)類型,固定16bit大小∮沉眨現(xiàn)如今机隙,Unicode字符集已經(jīng)進(jìn)行了擴(kuò)展,表示的范圍已經(jīng)超過了16bit萨西。Unicode字符集的數(shù)值范圍擴(kuò)大到了[U+0000,U+10FFFF]有鹿。

也就是說一個(gè)char能夠存儲16bit大小的數(shù)值,即2個(gè)字節(jié)谎脯。但是葱跋,就常用的UTF-8編碼來說,我們都聽說過他是用3或者4個(gè)字節(jié)來表示一個(gè)漢字的。就拿3個(gè)字節(jié)來算的話娱俺,一個(gè)char也存不下是不是际看?

我們繼續(xù)看api文檔的其他段落:

而且,絕大部分的中文字符的Unicode范圍是[0x4E00, 0x9FBB],恰好是在BMP范圍內(nèi)矢否。

是不是說這里出現(xiàn)了破解不了的矛盾呢仲闽?UTF-8占用3到4個(gè)字節(jié),char只能存2個(gè)字節(jié)(16bit)僵朗,然而UTF-8中的幾乎所有漢字都是在BMP范圍內(nèi)赖欣,也就是在char可存儲的范圍內(nèi),是不是矛盾了验庙?

一個(gè)char值可以表示BMP范圍內(nèi)的Unicode字符顶吮。BMP表示[U+0000, U+FFFF]之間的Unicode字符。

答案是不矛盾粪薛!關(guān)鍵點(diǎn)就在于接下來給出總結(jié)的第一條悴了!

這里先給出總結(jié),后續(xù)再給出解釋:

1.char字符存儲的是Unicode編碼的代碼點(diǎn)违寿,也就是存儲的是U+FF00這樣的數(shù)值湃交,然而我們在調(diào)試或者輸出到輸出流的時(shí)候,是JVM或者開發(fā)工具按照代碼點(diǎn)對應(yīng)的編碼字符輸出的藤巢。

2. 所以雖然UTF-8編碼的中文字符是占用3個(gè)或者4個(gè)字節(jié)搞莺,但是對應(yīng)的代碼點(diǎn)仍然集中在[0x4E00, 0x9FBB],所以char是能夠存下在這個(gè)范圍內(nèi)的中文字符的掂咒。

3. 但是對于超過16bit的Unicode字符集才沧,也就是Unicode的擴(kuò)展字符集,一個(gè)char是放不下的绍刮,需要兩個(gè)char才能放下温圆。

Unicode編碼

Unicode的出現(xiàn)是對混亂的ANSI編碼世界的一個(gè)大一統(tǒng),因而也叫做統(tǒng)一碼孩革、萬國碼岁歉、單一碼。Unicode編碼把世界上常用的語言字符都進(jìn)行了統(tǒng)一的編碼嫉戚,一個(gè)數(shù)值就代表一個(gè)字符刨裆,而且世界范圍內(nèi)公認(rèn)。

ANSI的編碼世界里彬檀,各中語言有自己的編碼規(guī)范帆啃,同一個(gè)數(shù)值在不同的國家代表不同的字符。所以當(dāng)文字在不同國家傳遞的時(shí)候(比如發(fā)郵件窍帝,看國外網(wǎng)頁)努潘,問題就很大了,我明明寫的是“愛我中華”,美國朋友看到的確實(shí)”°??ò?D?a”疯坤,一定是一臉問號报慕!

//=====模擬文字在不同編碼語言間傳遞的過程=====

//發(fā)帖子

String s = "愛我中華";

//編碼成字節(jié)流,通過網(wǎng)絡(luò)傳入压怠,或者存儲到文件

byte[] bytes = s.getBytes("GB2312");

System.out.println(s);

//國外朋友用自己電腦的編碼方式解析字節(jié)流

String s2 = newString(bytes, "ISO-8859-1");

//oh眠冈! shit, wtf!???????

System.out.println(s2);

有了Unicode這個(gè)統(tǒng)一編碼之后,全世界的計(jì)算機(jī)都能正確的解析到原始的字符菌瘫,對于國內(nèi)的文字信息蜗顽,國外的朋友唯一要做的就是懂中文!

UTF-8只是Unicode編碼的一種編碼轉(zhuǎn)換規(guī)范雨让,也就是怎么存儲Unicode代碼點(diǎn)的方案之一雇盖。另外還有UTF-16和UTF-32等編碼規(guī)范。Unicode為什么需要這么多編碼規(guī)范栖忠?直接存儲代碼點(diǎn)行不行崔挖?

當(dāng)然不行,存儲了就需要解析比如”漢字”兩個(gè)字的Unicode代碼點(diǎn)是“0x6c49和0x5b57”也就是”6c495b57”庵寞。而且狸相,Unicode的代碼點(diǎn)還有3個(gè)字節(jié)的,比如”10FF3B”,對于一個(gè)很長的上述數(shù)字串該怎么解析皇帮?比如“10FF3B6c495b57”卷哩!

所以蛋辈,需要某種編碼方案來區(qū)分那幾個(gè)數(shù)值是一個(gè)Unicode代碼點(diǎn)属拾,這種方案就是UTF-8、UTF-16冷溶、UTF-32這樣的編碼方案渐白。

UTF-8編碼和代碼點(diǎn)對應(yīng)關(guān)系

UTF-8以字節(jié)為單位對Unicode進(jìn)行編碼。從Unicode到UTF-8的編碼方式如下:

Unicode編碼(十六進(jìn)制)????UTF-8 字節(jié)流(二進(jìn)制)

000000-00007F????????????????0xxxxxxx

000080-0007FF????????????????110xxxxx 10xxxxxx

000800-00FFFF????????????????1110xxxx 10xxxxxx 10xxxxxx

010000-10FFFF????????????????11110xxx10xxxxxx10xxxxxx10xxxxxx

有沒有發(fā)現(xiàn)點(diǎn)什么逞频?當(dāng)一個(gè)字節(jié)表示一個(gè)字符時(shí)纯衍,二進(jìn)制開頭是0;當(dāng)兩個(gè)字節(jié)表示一個(gè)字符時(shí)苗胀,二進(jìn)制開頭是11襟诸;當(dāng)3個(gè)字節(jié)表示一個(gè)字符時(shí)基协,二進(jìn)制開頭是111;依次類推陷揪!

UTF-8編碼加入了多余的標(biāo)識位來區(qū)分一個(gè)Unicode代碼點(diǎn)!才會出現(xiàn)中文漢字集中在[0x4E00, 0x9FBB]范圍的16bit數(shù)值內(nèi)卦绣,UTF-8卻需要3個(gè)字節(jié)存儲的原因滤港。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趴拧,一起剝皮案震驚了整個(gè)濱河市八堡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缝龄,老刑警劉巖挂谍,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件口叙,死亡現(xiàn)場離奇詭異,居然都是意外死亡俺亮,警方通過查閱死者的電腦和手機(jī)脚曾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門本讥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拷沸,“玉大人薯演,你說我怎么就攤上這事∏诼” “怎么了愉镰?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵丈探,是天一觀的道長。 經(jīng)常有香客問我隘竭,道長动看,這世上最難降的妖魔是什么爪幻? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任挨稿,我火速辦了婚禮奶甘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疲陕。我一直安慰自己侣监,他們只是感情好橄霉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布姓蜂。 她就那樣靜靜地躺著钱慢,像睡著了一般卿堂。 火紅的嫁衣襯著肌膚如雪懒棉。 梳的紋絲不亂的頭發(fā)上策严,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天妻导,我揣著相機(jī)與錄音怀各,去河邊找鬼瓢对。 笑死,一個(gè)胖子當(dāng)著我的面吹牛份名,可吹牛的內(nèi)容都是我干的僵腺。 我是一名探鬼主播壶栋,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼琉兜,長吁一口氣:“原來是場噩夢啊……” “哼毙玻!你這毒婦竟也來了桑滩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎该互,沒想到半個(gè)月后韭畸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年妻顶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讳嘱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沥潭。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钝鸽,死狀恐怖庞钢,靈堂內(nèi)的尸體忽然破棺而出基括,到底是詐尸還是另有隱情风皿,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站媳维,受9級特大地震影響冰沙,放射性物質(zhì)發(fā)生泄漏拓挥。R本人自食惡果不足惜侥啤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一盖灸、第九天 我趴在偏房一處隱蔽的房頂上張望赁炎。 院中可真熱鬧,春花似錦讥裤、人聲如沸己英。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笆焰。三九已至仙辟,卻和暖如春叠国,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冤狡。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工悲雳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留合瓢,地道東北人晴楔。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓税弃,卻偏偏與公主長得像则果,于是被迫代替她去往敵國和親西壮。 傳聞我的和親對象是個(gè)殘疾皇子茸时,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容