中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Windows中Notepad里可選的字符編碼有哪些-創(chuàng)新互聯(lián)

這篇文章主要介紹Windows中Notepad里可選的字符編碼有哪些,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

做網(wǎng)站、成都網(wǎng)站建設(shè)的關(guān)注點(diǎn)不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒(méi)有做好網(wǎng)站,給創(chuàng)新互聯(lián)建站一個(gè)展示的機(jī)會(huì)來(lái)證明自己,這并不會(huì)花費(fèi)您太多時(shí)間,或許會(huì)給您帶來(lái)新的靈感和驚喜。面向用戶(hù)友好,注重用戶(hù)體驗(yàn),一切以用戶(hù)為中心。

簡(jiǎn)析Windows Notepad里可選的字符編碼

這篇文章就簡(jiǎn)單測(cè)試一下Windows Notepad的行為。

Windows中Notepad里可選的字符編碼有哪些

▲ Windows Notepad的編碼包含ANSI、Unicode、Unicode big endian和UTF-8。

警告

本文僅僅闡述一個(gè)廣泛使用的軟件的技術(shù)事實(shí),不代表作者支持或反對(duì)使用該軟件。
事實(shí)上作者推薦任何時(shí)候都不使用 Windows Notepad 來(lái)處理計(jì)算機(jī)程序代碼。
本文僅在某一個(gè)簡(jiǎn)體中文版64位Windows 7的實(shí)例下驗(yàn)證,僅供參考。不保證在其他相同或相異系統(tǒng)下能夠重現(xiàn)一致的結(jié)果。

注意

本文嚴(yán)格區(qū)分Unicode的編碼字節(jié)序列化。
Unicode的編碼僅指使用數(shù)(通常寫(xiě)成16進(jìn)制數(shù))來(lái)一對(duì)一的代表字符的工作。這個(gè)數(shù)的范圍僅受Unicode標(biāo)準(zhǔn)的約束,與計(jì)算機(jī)毫無(wú)關(guān)聯(lián)。
Unicode的字節(jié)序列化指為了能夠?qū)懭胗?jì)算機(jī)存儲(chǔ)器,而把一個(gè)Unicode標(biāo)準(zhǔn)范圍內(nèi)的數(shù),表示成N個(gè)字節(jié)的工作。

測(cè)試用例

測(cè)試用例為:“錕斤拷【斷行】a【斷行】”。(錕斤拷是一種信仰。)

所有字符的GBK和Unicode編碼為:

  • 錕 GBK=EFBF Unicode=U+951F

  • 斤 GBK=BDEF Unicode=U+65A4

  • 拷 GBK=BFBD Unicode=U+62F7

以下ASCII字符的GBK和Unicode編碼與ASCII一致:

a=0x61 CR=0x0D LF=0x0A
 (Windows一個(gè)換行符占有兩個(gè)字符:CR+LF)

ANSI

在簡(jiǎn)體中文系統(tǒng)下,ANSI就是中華人民共和國(guó)國(guó)家標(biāo)準(zhǔn)定義的GBK編碼。

Windows Notepad使用ANSI存儲(chǔ)這個(gè)文件的結(jié)果如下:

EF BF  BD EF  BF BD  0D  0A  61  0D  0A
-----  -----  -----  --  --  --  --  --

簡(jiǎn)單的使用GBK編碼存儲(chǔ)了所有的字符。高位不是1的單字節(jié)并等同于ASCII,否則雙字節(jié)。

這里要注意字節(jié)序(Endian)的問(wèn)題[注A]??梢钥吹竭@里的字節(jié)序是大端在先(big-endian)的。

但是不必特意強(qiáng)調(diào)“大端在先的GBK”——因?yàn)閺腉B2312開(kāi)始,標(biāo)準(zhǔn)就規(guī)定了存儲(chǔ)方式是大端在先的[注B]。后來(lái)的GBK和GB18030-2000向下兼容。

ANSI的麻煩就是依賴(lài)系統(tǒng)——其他語(yǔ)言系統(tǒng)的ANSI就不是GBK了,打開(kāi)GBK的文件必然亂碼。并且GBK的字符集本身也太小。
(千萬(wàn)不要說(shuō)“我只用中文”——少了Unicode那些符號(hào),網(wǎng)上那些顏文字都打不出來(lái))

Unicode系列

Windows Notepad所說(shuō)的“Unicode”、“Unicode big endian”和UTF-8,全都是同樣的Unicode編碼的不同的字節(jié)序列化存儲(chǔ)方法。

UTF-16 和 BOM

這里的Unicode指UTF-16[注C]。UTF-16是極其簡(jiǎn)單粗暴的序列化方法——絕大多數(shù)的Unicode字符都在U+0000~U+FFFF的范圍內(nèi)[注D],那就每個(gè)字符用兩個(gè)字節(jié),把Unicode編碼的原始值寫(xiě)盤(pán)。

注意ASCII字符也必須浪費(fèi)一倍的空間存儲(chǔ)高8位的0x00——因?yàn)槿绻迅?位的0略了,解析時(shí)就再也沒(méi)有其他的依據(jù)去斷字。

對(duì)于UTF-16就存在大端和小端的問(wèn)題了——UTF-16并不規(guī)定字節(jié)的大端在前還是小端在前。但UTF-16并不包含表示字節(jié)序的信息,總不能人工看看哪個(gè)解析是不亂碼的吧……

Unicode提供的解決方式是,把一個(gè)零寬無(wú)斷字空格符U+FEFF ZERO WIDTH NO-BREAK SPACE)以UTF-16的方式序列化之后,塞到文件的最前邊。這樣UTF-16解析器讀取文件的前兩個(gè)字節(jié),如果是FE FF就是大端在前,FF FE就是小端在前。

這個(gè)塞進(jìn)去的東西就叫BOM(Byte Order Mark,字節(jié)順序標(biāo)記)。

值得一提的是,零寬無(wú)斷字空格符也常用于充當(dāng)1個(gè)有效字符,破拆各種場(chǎng)合的字?jǐn)?shù)限制。包括SegmentFault的問(wèn)答和評(píng)論內(nèi)容在內(nèi)。

記事本的“Unicode”和“Unicode big endian”

單寫(xiě)“Unicode”,根本就不是一種存儲(chǔ)方法的完整表達(dá)。因?yàn)檫@只包含編碼而沒(méi)有字節(jié)序列化

M$出現(xiàn)這種錯(cuò)誤,我一點(diǎn)都不覺(jué)得奇怪。死記結(jié)論就可以了:Windows Notepad的“Unicode”就是UTF-16。

Windows Notepad使用“Unicode” = 小端在先的UTF-16,存儲(chǔ)這個(gè)文件的結(jié)果如下:

 FF FE 1F 95 A4 65 F7 62 0D 00 0A 00 61 00 0D 00 0A 00
 -BOM- ----- ----- ----- ----- ----- ----- ----- ----- 
U+FEFF  951F  65A4  62F7  000D  000A  0061  000D  000A <--Unicode原始值

Windows Notepad使用“Unicode big endian” = 大端在先的UTF-16,存儲(chǔ)這個(gè)文件的結(jié)果如下:

 FE FF 95 1F 65 A4 62 F7 00 0D 00 0A 00 61 00 0D 00 0A
 -BOM- ----- ----- ----- ----- ----- ----- ----- ----- 
U+FEFF  951F  65A4  62F7  000D  000A  0061  000D  000A <--Unicode原始值

UTF-8

UTF-8是一種用1~4個(gè)字節(jié)表示1個(gè)Unicode字符的變長(zhǎng)的字節(jié)序列化方法。具體的實(shí)現(xiàn)細(xì)節(jié)看這篇文章。UTF-8的好處在于:

  1. 無(wú)論是IETF的推薦,還是實(shí)際業(yè)界的執(zhí)行,UTF-8都是互聯(lián)網(wǎng)的標(biāo)準(zhǔn)。

  2. 向下兼容,ASCII字符UTF-8序列化后仍是原樣,任何ASCII文件也是有效的UTF-8文件。

  3. 沒(méi)有字節(jié)序問(wèn)題。UTF-8的字節(jié)序是由RFC3629定死的。

Windows Notepad使用UTF-8存儲(chǔ)這個(gè)文件的結(jié)果如下:

 EF BB BF  E9 94 9F  E6 96 A4  E6 8B B7  0D   0A   61   0D   0A
 --BOM---  --------  --------  --------  --   --   --   --   --
U+ FEFF      951F      65A4      62F7   000D 000A 0061 000D 000A <--Unicode原始值

注意UTF-8前邊仍然塞進(jìn)去了U+FEFF按照UTF-8序列化的結(jié)果EF BB BF,作為前邊提到過(guò)的BOM字節(jié)順序標(biāo)記。Windows Notepad存儲(chǔ)的UTF-8,是帶有BOM標(biāo)記的UTF-8

但是如果僅僅對(duì)于UTF-8而言,字節(jié)序是沒(méi)有意義的。因?yàn)閁TF-8的字節(jié)序被規(guī)范寫(xiě)死,U+FEFF編碼后必然得到EF BB FF,得不出其他的。沒(méi)有二義性,BOM就失去了原本的意義。也許只有區(qū)別UTF-8文件和UTF-16文件的用處……

如何對(duì)待UTF-8文件的BOM,RFC3629的第6章有詳細(xì)的規(guī)定,不加詳述。

值得一提的是,BOM我想很多PHP程序員都經(jīng)歷過(guò)并且恨之入骨——PHP不認(rèn)識(shí)文件中的BOM頭并會(huì)將其作為HTTP Response的正文送出。這甚至在無(wú)緩沖的情況下,會(huì)導(dǎo)致header()等必須在Response開(kāi)始前執(zhí)行的函數(shù)直接失效。

所以PHP程序員總是會(huì)喜歡UTF-8 without BOM的編碼方式——這基本也就宣布了Windows下的PHP開(kāi)發(fā),Windows Notepad完全的淘汰出局,哪怕是任何一星半點(diǎn)代碼的臨時(shí)修改。

番外:Notepad++的字符編碼測(cè)試

ANSI沒(méi)有區(qū)別,但Notepad++支持選擇多國(guó)編碼的不同ANSI編碼方式(類(lèi)似瀏覽器里選編碼),可以輕松生成或讀取Shift-JIS等其他字符集的文件。適合用于對(duì)付日文老游戲的README等文檔。

UCS-2 Big Endian、UCS-2 Little Endian和前邊UTF-16的兩個(gè)例子一致。注意UTF-16的文件不提供“無(wú)BOM”的存儲(chǔ)方法(提供了就壞了)。

UTF-8仍然代表“帶有BOM標(biāo)記的UTF-8”。但同時(shí)提供PHP程序員最?lèi)?ài)的UTF-8 without BOM,就像:

 E9 94 9F  E6 96 A4  E6 8B B7  0D   0A   61   0D   0A
 --------  --------  --------  --   --   --   --   --
U+ 951F      65A4      62F7   000D 000A 0061 000D 000A <--Unicode原始值

Simple and clean.

注解
[注A] 對(duì)于一個(gè)雙(多)字節(jié)的數(shù),一定會(huì)按8位截?cái)酁?字節(jié)后寫(xiě)盤(pán)。那么寫(xiě)盤(pán)時(shí)先寫(xiě)最低8位還是先寫(xiě)高8位,就是所謂的“字節(jié)序”(Endian)問(wèn)題。例如,數(shù)0x01020304寫(xiě)盤(pán)時(shí),是先寫(xiě)最低8位的04 03 02 01,還是先寫(xiě)高8位的01 02 03 04?
 先寫(xiě)低8位的叫做小端在先(little-endian),先寫(xiě)高8位的叫做大端在先(big-endian)。實(shí)際采用何種字節(jié)序受系統(tǒng)環(huán)境、標(biāo)準(zhǔn)規(guī)范和軟件實(shí)際編寫(xiě)的多方面控制,不一概而論。
[注B] 字節(jié)序如果我沒(méi)弄錯(cuò),是GB2312采用的EUC字符編碼方法控制的。
[注C] 本文并不嚴(yán)格區(qū)分UTF-16UCS-2。
[注D] Unicode的較大值實(shí)際上達(dá)到了U+10FFFF,超出了兩個(gè)字節(jié)能夠存儲(chǔ)的限度。
 但Unicode由于歷史原因,留下了U+D800~U+DFFF這一段永久保留不用的空缺區(qū)域。
 因此對(duì)U+10000及以上的字符,UTF-16借助了這部分空缺區(qū)域,對(duì)這些編碼超大的字符打破2字節(jié)16位的慣例,特別的用4字節(jié)32位去表示之。
 這一部分編碼值太大的字符,超出了GBK的字符集范圍,因此本文將完全忽略。如有機(jī)會(huì)再進(jìn)一步測(cè)試。

以上是“Windows中Notepad里可選的字符編碼有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章題目:Windows中Notepad里可選的字符編碼有哪些-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)鏈接:http://m.rwnh.cn/article38/isopp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、網(wǎng)站營(yíng)銷(xiāo)網(wǎng)站設(shè)計(jì)、標(biāo)簽優(yōu)化、網(wǎng)站維護(hù)、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
大埔区| 莱芜市| 泌阳县| 丹巴县| 曲松县| 榆林市| 陵川县| 锦州市| 漳浦县| 怀宁县| 叙永县| 勃利县| 东方市| 清丰县| 龙井市| 涡阳县| 托克托县| 罗源县| 工布江达县| 罗田县| 盈江县| 永城市| 尚义县| 萨迦县| 大方县| 尉氏县| 荔浦县| 黎川县| 隆安县| 绥德县| 黑山县| 体育| 佛学| 莫力| 吉隆县| 明水县| 安多县| 稷山县| 宣汉县| 文山县| 稷山县|