欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

java代碼單元代碼點(diǎn) JAVA碼點(diǎn)

關(guān)于Java核心技術(shù)書中的代碼點(diǎn)和代碼單元是怎么理解的呢?

這些應(yīng)該是從Unicode標(biāo)準(zhǔn)而來的術(shù)語,Unicode標(biāo)準(zhǔn)的核心是一個(gè)編碼字符集,它為每一個(gè)字符分配一個(gè)唯一數(shù)字。Unicode標(biāo)準(zhǔn)始終使用16進(jìn)制數(shù)字,并且在書寫時(shí)在前面加上U+,如字符“A”的編碼為“U+0041”。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、掇刀網(wǎng)站維護(hù)、網(wǎng)站推廣。

代碼點(diǎn)是指可用于編碼字符集的數(shù)字。編碼字符集定義一個(gè)有效的代碼點(diǎn)范圍,但是并不一定將字符分配給所有這些代碼點(diǎn)。有效的Unicode代碼點(diǎn)范圍是U+0000至U+10FFFF。Unicode4.0將字符分配給一百多萬個(gè)代碼點(diǎn)中的96382個(gè)代碼點(diǎn)。

代碼單元可以理解為字符編碼的一個(gè)基本單元,最常用的代碼單元是字節(jié)(即8位),但是16位和32位整數(shù)也可以用于內(nèi)部處理。

就Unicode標(biāo)準(zhǔn)來說,它的編碼字符集有三種編碼方案:UTF-32、UTF-16、UTF-8。UTF-32使用32位的代碼單元表示一個(gè)Unicode代碼點(diǎn),UTF-16使用一個(gè)或兩個(gè)16位的代碼單元的序列對(duì)Unicode代碼點(diǎn)進(jìn)行編碼,UTF-8 使用1至4個(gè)字節(jié)的序列對(duì)Unicode代碼點(diǎn)進(jìn)行編碼。

Java的char類型包含哪些數(shù)據(jù)?

java的char是2字節(jié),16bit,包含所有ascii字符,而且更多,api文檔里有描述

char的數(shù)據(jù)是通過 UnicodeData 文件中的信息定義的,該文件是 Unicode Consortium 維護(hù)的 Unicode Character Database 的一部分。此文件指定了各種屬性,其中包括每個(gè)已定義 Unicode 代碼點(diǎn)或字符范圍的名稱和常規(guī)類別。

此文件及其描述可從 Unicode Consortium 獲得,網(wǎng)址如下:

Unicode 字符表示形式

char 數(shù)據(jù)類型(和 Character 對(duì)象封裝的值)基于原始的 Unicode 規(guī)范,將字符定義為固定寬度的 16 位實(shí)體。Unicode 標(biāo)準(zhǔn)曾做過修改,以允許那些其表示形式需要超過 16 位的字符。合法代碼點(diǎn) 的范圍現(xiàn)在是從 U+0000 到 U+10FFFF,即通常所說的 Unicode 標(biāo)量值。(請(qǐng)參閱 Unicode 標(biāo)準(zhǔn)中 U+n 表示法的定義。)

從 U+0000 到 U+FFFF 的字符集有時(shí)也稱為 Basic Multilingual Plane (BMP)。代碼點(diǎn)大于 U+FFFF 的字符稱為增補(bǔ)字符。Java 2 平臺(tái)在 char 數(shù)組以及 String 和 StringBuffer 類中使用 UTF-16 表示形式。在這種表現(xiàn)形式中,增補(bǔ)字符表示為一對(duì) char 值,第一個(gè)值取自高代理項(xiàng) 范圍,即 (\uD800-\uDBFF),第二個(gè)值取自低代理項(xiàng) 范圍,即 (\uDC00-\uDFFF)。

所以,char 值表示 Basic Multilingual Plane (BMP) 代碼點(diǎn),其中包括代理項(xiàng)代碼點(diǎn),或 UTF-16 編碼的代碼單元。int 值表示所有 Unicode 代碼點(diǎn),包括增補(bǔ)代碼點(diǎn)。int 的 21 個(gè)低位(最低有效位)用于表示 Unicode 代碼點(diǎn),并且 11 個(gè)高位(最高有效位)必須為零。除非另有指定,否則與增補(bǔ)字符和代理項(xiàng) char 值有關(guān)的行為如下:

只接受一個(gè) char 值的方法無法支持增補(bǔ)字符。它們將代理項(xiàng)字符范圍內(nèi)的 char 值視為未定義字符。例如,Character.isLetter('\uD840') 返回 false,即使是特定值,如果在字符串的后面跟著任何低代理項(xiàng)值,那么它將表示一個(gè)字母。

接受一個(gè) int 值的方法支持所有 Unicode 字符,其中包括增補(bǔ)字符。例如,Character.isLetter(0x2F81A) 返回 true,因?yàn)榇a點(diǎn)值表示一個(gè)字母(一個(gè) CJK 象形文字)。

在 Java SE API 文檔中,Unicode 代碼點(diǎn) 用于范圍在 U+0000 與 U+10FFFF 之間的字符值,而 Unicode 代碼點(diǎn) 用于作為 UTF-16 編碼的代碼單元的 16 位 char 值。有關(guān) Unicode 技術(shù)的詳細(xì)信息,請(qǐng)參閱 Unicode Glossary。

java中關(guān)于代碼單元和代碼點(diǎn)

String的offsetByCodePoints(int index, int codePointOffset)方法返回此 String 中從給定的 index 處偏移 codePointOffset 個(gè)代碼點(diǎn)的索引。

所以4就是從0開始往后偏移4后的索引。

codePointAt(int index)方法是返回指定索引處的字符。

在索引為4處的字符為‘o’,它對(duì)應(yīng)的ASCII碼為111

Java中代碼點(diǎn)和代碼單元是什么?怎么理解?舉例說明下,它們之間有什么聯(lián)系有什么區(qū)別?為什么代碼點(diǎn)

代碼點(diǎn)就是指javascript型的信息點(diǎn)而代碼單元指普遍的廣泛的jinmk 和gdp信息技術(shù)網(wǎng)

winhex8位反向字節(jié)的順序

一、char 碼點(diǎn)和代碼單元

在Java Core 卷1中 對(duì)Char的描述如下

在設(shè)計(jì)Java時(shí)決定采用16位的Unicode字符集....(中間省略)... 現(xiàn)在16位的Char類型已經(jīng)不能滿足描述所有Unicode字符的需要了。

Java為了解決這個(gè)問題的方法是使用碼點(diǎn)和代碼單元

代碼點(diǎn)(Code Point):在 Unicode 代碼空間中的一個(gè)值,取值 0x0 至 0x10FFFF,代表一個(gè)字符。

代碼單元(Code Unit):在具體編碼形式中的最小單位。比如 UTF-16 中一個(gè) code unit 為 16 bits,UTF-8 中一個(gè) code unit 為 8 bits。一個(gè) code point 可能由一個(gè)或多個(gè) code unit(s) 表示。在 U+10000 之前的 code point 可以由一個(gè) UTF-16 code unit 表示,U+10000 及之后的 code point 要由兩個(gè) UTF-16 code units 表示

在Java中,char類型描述了UTF-16編碼中的一個(gè)代碼單元

碼點(diǎn):就是某個(gè)任意字符在Unicode編碼表中對(duì)應(yīng)的代碼值代碼單元:是在計(jì)算機(jī)中用來表示碼點(diǎn)的,大部分碼點(diǎn)只需要一個(gè)代碼單元表示,但是有一些是需要兩個(gè)代碼單元表示的。

不同碼點(diǎn)對(duì)應(yīng)的代碼單元數(shù)量可能不同

下面實(shí)際操作體驗(yàn)一番

" " 這個(gè)數(shù)學(xué)符號(hào)碼點(diǎn) 為U+1D546 在 Java中的代碼單元為 U+D835 和U+DD46

String word = "uD835uDD46";

System.out.println("字符為:"+word + " String.length(): "+ word.length());

打印結(jié)果如下(String.length()返回的是字符串代碼單元的長度)。

字符為: String.length(): 2

而且char類型無法放下這個(gè)符號(hào)

//char c = ' ';

String word2 = " ";

String firstUnit = Integer.toHexString(word.charAt(0));

String secondUnit = Integer.toHexString(word.charAt(1));

String codePoint = Integer.toHexString(word2.codePointAt(0));

System.out.println("第一個(gè)單元:" + firstUnit + " 第二個(gè):" + secondUnit + " 碼點(diǎn):" +codePoint);

打印結(jié)果

第一個(gè)單元:d835 第二個(gè):dd46 碼點(diǎn):1d546

二、UTF-16編碼方式

我們來思考UTF-16的設(shè)計(jì)思路:

我們知道Unicode的范圍為0x0~0x10FFFF

首先是0x0~0xFFFF這段區(qū)間,正好16位就可以表示,也兼容,兩全其美

那么超過這個(gè)區(qū)間的怎么辦呢?

也就是0xFFFF~0x10FFFF這段,我們先看這段區(qū)間有多少個(gè)碼位,

0x10FFFF-0xFFFF=0x100000,那么這個(gè)十六進(jìn)制表示的十進(jìn)制也就是:1048576個(gè)碼位

我們既然16位存不下,那肯定就是32位存咯,這個(gè)32能理解為什么不?不理解?是因?yàn)橛?jì)算機(jī)只能以2的倍數(shù)拓展,如果不這么設(shè)計(jì),就沒辦法解析。長短不一,不符合設(shè)計(jì)思路

32位來存這些數(shù)字,那么我們需要怎么存下呢,簡單的思考過后,大家認(rèn)為應(yīng)該分開存儲(chǔ),也就是將32位分開前16位和后16位,每個(gè)16位各存一半

那么每一半存的就是1024(由來:1024*1024=1048576),1024代表的是2的10次冪,也就是10位二進(jìn)制數(shù)

這樣就知道了,32位二進(jìn)制數(shù)字中,前后16位中各存10位就夠用了,但是剩余的6位用來干什么呢?

和UTF-8的設(shè)計(jì)一樣,為了讓識(shí)別字符串變得容易(從文本的任意位置開始,均能區(qū)分一個(gè)字符的起始),這里是不是有點(diǎn)兒蒙?

舉個(gè)栗子:

假設(shè):

0000 0001 代表A

0000 0010 代表B

0000 0001 ,0000 0001 代表 X

0000 0010 ,0000 0001 代表Z

那么 ABXZ就是

0000 0001 ,0000 0010 , 0000 0001 ,0000 0001 , 0000 0010,0000 0001

A B X Z

但是讓你從中間開始讀取,當(dāng)你讀到X的時(shí)候,你不知道他是X還是 AB,這樣就很麻煩,你需要設(shè)置標(biāo)志,來讓16位的數(shù)據(jù)的前8或后8不會(huì)和單個(gè)8位的重復(fù)

可以這樣設(shè)計(jì):

0xxx xxxx 代表0~2^7

11xx xxxx ,10xx xxxx 代表其他的

這樣就能區(qū)分開了,當(dāng)你讀到11開頭的,就代表他是16位的前8,10開頭代表16位的后8

歐了,有了這個(gè)思路,我們就知道怎么設(shè)計(jì)剛才的那個(gè)6位了,當(dāng)然是通過這6位來區(qū)分這16位數(shù)字代表的位置

也就是UTF-16中,表示數(shù)據(jù)有單16位和雙16位(32位)兩種,那么我們?cè)O(shè)計(jì)成單16位和32位中的前16位和后16位這三個(gè)16位完全不會(huì)重復(fù),那么我們就能隨時(shí)讀到一組16位,就能知道他是單16還是前16還是后16

舉個(gè)栗子:

根據(jù)上方信息,要求我們通過前6位來區(qū)分?jǐn)?shù)據(jù),那么前6位就是2^6=64,也就是開頭數(shù)字的區(qū)間

我們?cè)O(shè)定如下:

54開頭的為32位的前16位

55開頭的為32位的后16位

其他開頭的為單16位

這樣我們就能區(qū)分開這三個(gè)16位了,在讀取文檔中的任意位置,都能隨意區(qū)分出間隔咯

那么54開頭的數(shù)據(jù)區(qū)間是多少呢,就是1101 10xx xxxx xxxx,區(qū)間就是D800~DBFF

那么55開頭的數(shù)據(jù)區(qū)間是多少呢,就是1101 11xx xxxx xxxx,區(qū)間就是DC00~DFFF

為了配合UTF-16,Unicode中也將這兩個(gè)區(qū)間屏蔽掉,不允許分配任何字符

下方為比較官方的關(guān)于UTF-16的編碼詳解

參考文獻(xiàn):

具體編碼方式

Unicode范圍U+10000~U+10FFFF:將Unicode值減去(0x10000),得到20bit長的值。再將Unicode分為高10位和低10位。UTF-16編碼的高位是2 Byte,高10位Unicode范圍為0-0x3FF,將Unicode值加上0XD800,得到高位代理(或稱為前導(dǎo)代理,存儲(chǔ)高位);低位也是2 Byte,低十位Unicode范圍一樣為0~0x3FF,將Unicode值加上0xDC00,得到低位代理(或稱為后尾代理,存儲(chǔ)低位)

根據(jù)上面的轉(zhuǎn)換方式,我們就能夠?qū)nicode碼根據(jù)UTF-16的編碼方式進(jìn)行轉(zhuǎn)換。下面我們?nèi)匀煌ㄟ^兩個(gè)例子來看下:

U+0020,這個(gè)值的范圍在第一部分,即經(jīng)過UTF-16編碼后,結(jié)果仍然為U+0020,在內(nèi)存中的順序?yàn)?0 20。

U+12345, 這個(gè)值的范圍在第二部分,因此需要先減去0x10000,得到0x02345,拆分成高10位00 0000 1000和低10位11 0100 0101。根據(jù)上面規(guī)則加上特定值后,高位代理值為D808,低位代理值為DF45,最終內(nèi)存中的順序?yàn)镈8 08 DF 45。

java代碼點(diǎn)數(shù)

結(jié)果是3 108

offsetByCodePoints(1,2);//返回從1處開始的第2個(gè)Code Point的位置

代碼點(diǎn)(codepoint):是指與一個(gè)編碼表中的某個(gè)字符對(duì)應(yīng)的代碼值。

也就是從下標(biāo)1開始的第2個(gè)代碼點(diǎn)的位置,那不就是3么.

codePointAt(index); //獲取第index位置的Code Point.返回類型是對(duì)應(yīng)字符的ascii.

那就是獲取第3位的代碼點(diǎn)也就是l.而l對(duì)應(yīng)的ascii碼就是108

新聞標(biāo)題:java代碼單元代碼點(diǎn) JAVA碼點(diǎn)
文章出自:http://www.chinadenli.net/article28/hpigjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)品牌網(wǎng)站設(shè)計(jì)微信小程序App開發(fā)軟件開發(fā)自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)