理論上一個位元組能不能表示一個漢字?


0 -&> NULL

1 -&> 漢


你是要重新定義位元組,還是要重新定義漢字,或者是要重新定義表示?


用 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: 0

B: 10

C: 110

D: 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統一碼 | 字元編碼 |