常見(jiàn)問(wèn)題字符疑問(wèn)收集
什么是ANSI字符集?
這個(gè)不是固定字符集,如果在中文簡(jiǎn)體windows中,它代碼字符集是gb2312,在繁體值代表是big5等等。
為什么英文字符不會(huì)出現(xiàn)亂碼?
常見(jiàn)ascii碼字符集是:128字符,對(duì)應(yīng)編碼值是:1-128 ,二進(jìn)制表示是:00000001-01111111。它表示了所有常見(jiàn)英文數(shù)字,標(biāo)點(diǎn)符號(hào)。其它字符集都是由ascii碼字符集擴(kuò)展而來(lái),擴(kuò)展了最高位由10000000開(kāi)始,用多字節(jié)表示新的字符,基本都保留了:0xxxxxxx 開(kāi)頭128個(gè)基本字符,而且對(duì)應(yīng)編碼與ascii碼相同。
這樣,常見(jiàn)英文字符不論在那種字符集中,對(duì)應(yīng)字符編碼一致,存儲(chǔ)編碼也一樣。讀取時(shí)候無(wú)論用什么字符集讀取,它所對(duì)應(yīng)字符也一直。所有基本不會(huì)出現(xiàn)亂碼情況。
讀取軟件能夠識(shí)別存儲(chǔ)文件的字符集嗎?
由于目前各種字符集加起來(lái)有上百種,目前除了unicode字符集,定義的存儲(chǔ)文件頭,基本其它字符集只是給出了對(duì)應(yīng)的字符編號(hào)值。因此,相同編號(hào)會(huì)出現(xiàn)在不同的字符集中,光從文件存儲(chǔ)的編碼值,是不能確定它的字符集的。如:gb2312字符集中,D6d0對(duì)應(yīng)是“中”,而同樣是:D6D0在ecu-jp 字符集中,對(duì)應(yīng)是“面”
什么是bom頭?
bom全稱(chēng)是:byte order mark,漢語(yǔ)意思是標(biāo)記字節(jié)順序碼。只是出現(xiàn)在:unicode字符集中,只有unicode字符集,存儲(chǔ)時(shí)候,要求指定編碼,如果不指定,windows還會(huì)用默認(rèn)的:ANSI讀取。常見(jiàn)的bom頭是:
UTF-8 ║ EF BB BF UTF-16LE ║ FF FE (小尾) UTF-16BE ║ FE FF (大尾) UTF-32LE ║ FF FE 00 00 UTF-32BE ║ 00 00 FE FF
unicode與utf-8 、utf-16 utf-32是什么關(guān)系?
unicode(統(tǒng)一碼、萬(wàn)國(guó)碼、單一碼)是一種字符集,Unicode是國(guó)際組織制定的可以容納世界上所有文字和符號(hào)的字符編碼方案。Unicode用數(shù)字0-0x10FFFF來(lái)映射這些字符,最多可以容納1114112個(gè)字符,或者說(shuō)有1114112個(gè)碼位。UTF-8、UTF-16、UTF-32都是將數(shù)字轉(zhuǎn)換到程序數(shù)據(jù)的編碼方案。在Unicode中:漢字“字”對(duì)應(yīng)的數(shù)字是23383。我們可以用:UTF-8、UTF-16、UTF-32表示這個(gè)數(shù)字,將數(shù)字23383存儲(chǔ)在計(jì)算機(jī)中。UTF-8對(duì)應(yīng)是:0xE6, 0xB1, 0x89(3個(gè)字節(jié)),UTF-16對(duì)應(yīng)是:0x6c49(2個(gè)字節(jié)),UTF-32對(duì)應(yīng)是:0x6c49(4個(gè)字節(jié))。utf-8,utf-16,utf-32是unicode碼一種實(shí)現(xiàn)形式,都是屬于unicode編碼。
unicode編碼特點(diǎn)是什么?
unicode編碼特點(diǎn)是,它定義了編碼方式和存儲(chǔ)實(shí)現(xiàn)方式。編碼方式就是上面說(shuō)的可以用,utf-8…utf-32表示,而存儲(chǔ)實(shí)現(xiàn)方式,無(wú)論那種編碼都知道了文件頭(bom)。因此,可以通過(guò)這個(gè)特殊頭來(lái)判斷存儲(chǔ)的文本文件使用那種字符集編碼。 為什么utf-8編碼不指定bom頭(可以理解為文件頭),軟件任然可以正常判斷出它字符集編碼?這個(gè)問(wèn)題估計(jì)很多朋友都會(huì)產(chǎn)生疑問(wèn),為什么utf-16不指定就讀亂碼,而utf-8可以。我們可以從下面的例子看下: utf-8是怎么樣從unicode轉(zhuǎn)換而來(lái)了。 Unicode編碼(16進(jìn)制) ║ UTF-8 字節(jié)流(二進(jìn)制) 000000 - 00007F ║ 0xxxxxxx 000080 - 0007FF ║ 110xxxxx 10xxxxxx 000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx 010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 從上面看,發(fā)現(xiàn)規(guī)律沒(méi)有?第一個(gè)自己開(kāi)頭有幾個(gè)”1”,后面就對(duì)應(yīng)有幾個(gè)10開(kāi)頭字節(jié)了。 這樣我們都可以通過(guò)正則進(jìn)行檢測(cè)了. [\x09\x0A\x0D\x20-\x7E] # ASCII
|[\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
|\xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
|\xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
|\xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
|[\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
|\xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
由于它獨(dú)特的編碼存儲(chǔ)特點(diǎn),因此目前常見(jiàn)文本處理軟件就能夠自動(dòng)分析出來(lái)。(windows記事本,editplus,notepad++等)
本文導(dǎo)航
- 第1頁(yè): 首頁(yè)
- 第2頁(yè): 什么是字符編碼?
- 第3頁(yè): 常見(jiàn)問(wèn)題字符疑問(wèn)收集
- 第4頁(yè): 為什么bom頭會(huì)產(chǎn)生亂碼?
- 第5頁(yè): 字符集是怎么樣一個(gè)演變過(guò)程呢?
- 第6頁(yè): CJK字符集是什么?