理論上一個位元組能不能表示一個漢字?
0 -&> NULL1 -&> 漢
你是要重新定義位元組,還是要重新定義漢字,或者是要重新定義表示?
用 LZMA 的話,通常而言,不到一個位元組就可以表示一個漢字(滾)
可以啊,造一台一位元組32位的機子
一個位元組是8位二進位數,2^8=256,每一個8位的二進位數組合對應一個漢字的話,最多能映射256個漢字。
可以。
但是你只能表示 255 個漢字。
我們還可以設計 256 套編碼。
第零套是 ASCII,第一套開始是 255 種漢字編碼,各自代表了不同的漢字字符集。
然後我們就可以表示出所有的漢字了。
當然如果你管這個叫一個位元組表示一個漢字的話。
正解:https://www.zhihu.com/question/50884226/answer/274531909
吳軍老師曾經有篇文章談到了語言的信息熵,英文大概是4.46比特/字元,中文是9.6比特/字元。考慮到一位元組是8比特,那麼壓縮到極致中文也沒法用一位元組表示,所以理論上來說就是不可能的
當然重新定義位元組就是別的問題了
----------------------------------------------
關於信息熵怎麼計算的我來說明一下
首先這是一個確實的可計算的概念,來自於香農定理。為了方便講解怎麼計算這個東西,我們還需要講講香農編碼
香農編碼是一種概率編碼,首先算出所有信息的出現頻率,這裡我們就假編一套數據A:1/2, B:1/4, C:1/8, D:1/8,然後根據這些頻率來排序再生成樹。
生成的方法是:每次都被選的樹分為兩堆,概率盡量相等,然後重複這個過程直到樹都被分好了。
另一個等價的說法是:每次都可以問一個問題(這個元素是不是xx元素),那麼我們應該怎麼去問才好?
以這個規則來說,第一個問題是,這個字元是不是A,第二個問題問是不是B,第三個問是不是C--是不是D不用問,因為這個時候不是C就肯定是D了。
然後二叉樹的構造那邊,大家自己腦海里設想一下,這裡我們假設左子樹是0,右子樹是1,每次分配都先左後右
那麼,編碼就是:
A: 0B: 10C: 110D: 111那麼平均的碼長是多少呢?這裡要結合概率加權:
1*0.5 + 2*0.25 + 3*0.25 = 1.75
相比較一般直接兩種情況兩位編碼的平均2長度來說,香農編碼算是勝出了。(不過實際情況中這個1/2不一定湊得出來,所以實際利用的場景很少甚至幾乎沒有)
那麼香農編碼的核心思想是什麼,估計大家也已經明白了:給大概率的字元短編碼,小概率的字元長編碼
那麼信息熵是什麼,又怎麼計算?
對於每一個字元p來說,它的信息熵是:f(p)=log(1/p) =-log(p)
為什麼呢?因為我們需要的是獨立的不確定性可加,只有對數可以滿足--這裡的log底數是2,是因為我們用二進位比較方便;當然可以是其他進位
那我們這裡計算一下剛才那個例子的信息熵:
-( 1/2 * log(1/2) + 1/4 * log(1/4) + 1/4 * log(1/8) ) = 1/2 + 1/2 + 3/4 = 1.75
(這裡乘上概率是因為有出現頻率,而算的結果是平均信息熵)
那麼推廣到中文呢?就是算出每一個字的出現頻率,然後再去算就好了--當然並不保證香農編碼可以做到這一點,這只是一個理論極限表示一個漢字,實際上的意義就是在英文里表示一個詞
所以如果只是要用1位元組存儲
可以每個位元組存偏旁和基礎字
多個位元組組合成一個完整字
理論肯定不夠,許多漢字都不包括在可變長度 1-3 位元組的 utf-8 里,在知乎上經常打不出字,更別提 1 位元組。
實際如果只需要覆蓋一本小學生漢語字典,單位元組是夠的。
附
1 位元組(Byte) = 1 個英文字元(UTF-8 編碼) = 8 比特(bit) = 8 位二進位數字 = 256其實能表示256個。
如果按讀音來,根據北洋政府的讀音字母表ㄅㄆㄇㄈ萬、ㄉㄊㄋㄌ、ㄍㄎ兀ㄏ、ㄐㄑ廣ㄒ、ㄓㄔㄕㄖ、ㄗㄘㄙ、ㄧㄨㄩㄚㄛㄜㄝ、ㄞㄟㄠㄡ、ㄢㄣㄤㄥ、ㄦ大概40個左右,6位足夠表示一個讀音,但是大部分漢字不止一個讀音,這個方案(類似韓語去漢化)不能。
如果按筆畫來,類似5筆,每個偏旁部首需要300個左右表示,就算他是256能表示一個,大部分漢字也不止一個偏旁,所以也不行。
不過話又說回來,對於西洋文,一個位元組也只能夠字母表和一些特殊符號表示吧,英語一個位元組也不夠表示一個單詞啊。
個人偏見:
1,無論是語言還是文字,都是一種映射,文字是字形到意思的映射,語言是聲音到意思的映射。
2,要保證意思被表達出來,必須要保證映射不衝突,或者通過上下文能夠解析出來映射指向哪裡。
3,漢字編碼也是一種映射,你要麼想辦法給每個漢字都編一個碼,要麼就是通過上下文能夠區分出同樣的編碼對應是那個漢字。
簡單地說,可以。
比如你可以腦補這麼一種編碼,就像以前的各種標準的ascii擴展區:
0-127 按ascii,畢竟還是要兼容洋文。
128-255 是漢字,因為只有128個碼點,所以只能編碼128個漢字。
如果覺得128個漢字太少了,那某些漢字用一個位元組表示,還有些就必須要用兩個三個四個了。
比如拿出一半給雙位元組,一半給單位元組,就:
128-223 編碼字頻最高的64個漢字(比如128代表「的」,129代表「一」,等等)
224-255 就編碼的是兩個位元組的第一個位元組了,比如按最粗暴方法(不要位元組級別的可查找保證了不要自同步性了不要容錯了)只管完美用上第二個位元組,就可以再編64*256個兩位元組碼:其中
224 0 代表第一個,224 1代表第二個,……,255 255代表最後一個。
這編碼空間就完了,總共可以收錄64+64*256=16448個漢字(包括標點或者任何你想編碼的東西)+128個ascii字元。
(64個最高頻漢字應該可以覆蓋30%多的文本了,也就是平均大致普通文本不搞陰謀一般情況統計意義上可以比GB編碼小15%多)
也可以在2位元組的區域里劃分一部分區域用來編3位元組、4位元組,覆蓋完unicode都可以。
就醬。
不是能不能表示的問題,而是漢字太多,一個位元組不夠
謝邀,但我沒看懂問題。理論上一個位元組能表示一個漢字,實際上視乎編碼可以代表任何字元,但一個位元組只能編碼256個字,意義何在?
另外這與 Unicode 沒有直接關係。可以表示一個啊,就是最多256個
沒有什麼字不是一個位元組表達不了的,如果有,那就兩個!
當然可以了,
把任意的漢字打好放到一個文件夾裡面。
壓縮這個文件夾(對沒錯就是那個winrar或者好壓或者7zip什麼的)
再把這個壓縮包放到一個文件夾裡面
壓縮這個文件夾(對沒錯就是那個winrar或者好壓或者7zip什麼的)
再把這個壓縮包放到一個文件夾裡面
壓縮這個文件夾(對沒錯就是那個winrar或者好壓或者7zip什麼的)
再把這個壓縮包放到一個文件夾裡面
壓縮這個文件夾(對沒錯就是那個winrar或者好壓或者7zip什麼的)
再把這個壓縮包放到一個文件夾裡面
壓縮這個文件夾(對沒錯就是那個winrar或者好壓或者7zip什麼的)
再把這個壓縮包放到一個文件夾裡面
壓縮這個文件夾(對沒錯就是那個winrar或者好壓或者7zip什麼的)
再把這個壓縮包放到一個文件夾裡面
壓縮這個文件夾(對沒錯就是那個winrar或者好壓或者7zip什麼的)
。。。
一個位元組不僅能表示一個漢字,甚至可以把Windows裝進去
看樓主的意思就是想對漢字進行編碼,就是一個漢字唯一對應一個編碼數值,想問一個位元組能否編碼覆蓋所有漢字。既然如此,答案很明顯就是不可能。
一個位元組8位,可以表達256種不同情況,那麼就可以編碼256個漢字。這個結論不細說推理過程了。參考同問題下的回答:
Arkham:理論上一個位元組能不能表示一個漢字?
Hito:理論上一個位元組能不能表示一個漢字?
漢字總量不止256個,所以答案就是不行。
兩個位元組16位,可以表達65536種不同情況,可以編碼65536個漢字。漢字總量少於65536個,所以編碼漢字需要2個位元組。
但是放在全球領域,如何表達更多國家的文字,需要通盤考慮。也就是全球的文字合在一起來編碼,2個位元組就需要合理分配,否則可能又不夠了。
所以有各種編碼出來。比如utf8,utf16等等。這是編碼方式。
再加上存儲方式,比如是一個位元組存儲一個符號,還是兩個位元組存儲一個符號,就是所謂的char,wchar_t,然後存儲方式與編碼方式攪合在一起,真的是混亂不堪,反正我到現在還是迷迷糊糊的。
比如utf8,utf16等是char型的。而Unicode是wchar_t型的。Unicode轉換成utf16,可能不成功的……
大概的意思是說基於char的存儲方式,進行了多種編碼方法的發明,如utf8,utf16等等,然而這些編碼方式最終發現還是無法滿足在全球範圍內的文字表達。雖然這些編碼方法中,不泛多個位元組表達一個字元的情況,但是存儲方式還是基於char的。
最後就擴充了存儲方式,使用字(2個位元組)來存儲字元,這樣一來,全球所有的文字都表達完了。應該就是全球所有的文字合在一起,也沒有超過65536個?
推薦閱讀:
※Python2.7 中文字元編碼,使用Unicode時,選擇什麼編碼格式?
※用python模擬登錄知乎,爬回來的是亂碼?
※在計算機中為何不直接使用UTF8編碼進行存儲,而要使用Unicode再轉換成UTF8?
※Unicode 是不是只有兩個位元組,為什麼能表示超過 65536 個字元?
※為什麼編碼(GBK、Big-5 等)問題這種歷史遺留始終得不到解決?
TAG:Unicode統一碼 | 字元編碼 |