1、
什麼是字元?
從顯示的角度來說,字元可以理解成就是我們需要顯示的單一實體。包括,數字6,字母5,中文「好」等等。
對字元的其它名詞解釋:
字元(character)是文字與符號的總稱,包括文字、圖形符號、數學符號等。
2、什麼是字符集?
一組字元的集合就是字符集。
字符集常常和一種具體的語言文字對應起來,該文字中的所有字元或者大部分常用字元就構成了該文字的字符集,比如英文字符集。
一組有共同特徵的字元也可以組成字符集,比如繁體漢字字符集、日文漢字字符集。
比如,我們經常使用的簡體中文,這麼多個常用漢字組合在一起就是簡體中文字符集。
3、為什麼需要對字元進行編碼?
能讓計算機使用的資料0和1表示出字符集中的絕大部分或者全部字元,這就是字元編碼。
另外一種解釋:計算機要處理各種字元,就需要將字元和二進位制內碼對應起來,這種對應關係就是字元編碼(encoding)。
4、常見字元編碼對應的二進位制資料形式如下:
注:使用記事本儲存檔案得到的資料。
字元「abc」的ansi編碼對應的二進位制形式:
中文字元「中國」的ansi編碼對應的二進位制形式:
字元組合「a中國」的ansi編碼對應的二進位制形式:
字元「abc」的unicode編碼(預設是小端法)對應的二進位制形式:
注意:fffe
僅僅是標記是何種編碼,並不是編碼的資料。
字元「abc」的unicode大端法編碼對應的二進位制形式:
注意:feff
僅僅是標記是何種編碼,並不是編碼的資料。
字元「abc」的utf8編碼對應的二進位制形式:
注意:efbbbf僅僅是標記是何種編碼,並不是編碼的資料。
中文字元「中國」的unicode編碼對應的二進位制形式:
中文字元「中國」的unicode大端法編碼對應的二進位制形式:
中文字元「中國」的utf8編碼對應的二進位制形式:
可以看得出來,不同編碼格式對於相同字元對應的二進位制形式是不完全一樣的。
ansi編碼對於ascii碼字元是乙個位元組,對於中文字元是兩個位元組編碼;
unicode編碼預設對於任何字元都是兩個位元組編碼,有特殊情況;
utf8編碼對於ascii碼是採用乙個位元組,且與ansi編碼一致;對於中文字元是三個位元組。
實際上,很多編碼轉換函式,就是把上面的資料進行相關的數**算,得到預期編碼格式的資料。
(注: 不好意思,上面這幅圖中**注釋有錯)
程式**是將utf8格式資料轉換成unicode格式(這裡預設是utf16le格式)。
假設傳入的是中文字元「周排行」的utf8格式資料,如下:
e591a8
e68e92
e8a18c
周排行轉換得到的utf16le格式資料為:
685492
634c88
周排行
5、c++源**需要特定的編碼格式嗎?
作業系統環境:中文windowsxpprofessinalsp2版本
編譯器環境:vs2005
源**格式:.cpp
源**:
//中differentcodingstyle.cpp:定義控制台應用程式的入口點。
//
#include
"stdafx.h"
#include
using
namespace
std;
int_tmain
(int
argc
,_tchar
*argv)
源**對應的二進位制形式:
從另存為的選項中可以看出缺省編碼方式是gb2312.
經測試,同樣可以把源**的編碼格式改為別的,如utf8等,在上面的環境下編譯一樣可以通過。(注:在不同環境可能會有編譯不通過的)。
6、ansi編碼是什麼?
ansi編碼是不同國家和地區根據當地使用的字符集進行本地化的一種編碼方式。如在簡體中文系統下,ansi編碼就是gb2312編碼;在日文系統下,ansi編碼就是jis編碼;而對於純英文系統ansi編碼就是ascii編碼。
7、unicode是字符集還是編碼格式?
unicode是一種字符集,是包含基本上所有字元的字符集。但是很多情況下,很多人把它又當作一種編碼格式的名稱,正如記事本程式一樣:
每種字符集都會對應於至少一種編碼方式。unicode字符集的編碼格式有:
utf8
utf16le:utf16小端法(兩個位元組表示乙個字元,自然有大端小端之說)
utf16be:utf16大端法
utf7
……也可以理解,把unicode稱為編碼格式的一種,也許就是因為unicode預設是兩位元組乙個字元,utf16正是兩個位元組乙個字元,所以unicode也就這麼叫了。
8、unicode和utf是什麼關係?
實現unicode字符集的編碼方式即被稱為unicode轉換格式,即unicodetranslationformat,簡寫為utf.
9、對於utf8、utf16等編碼格式的字串資料,c程式中是使用char*來指向它們所在的緩衝區還是用wchar_t*,或者用更複雜的格式?
char*表示字串時是用於表示以0結束的字串。在僅僅表示ascii碼字元的時候很有用。
utf8中ascii碼字元和ansi的ascii碼字元一致,所以用char*也可以,中文字元使用的是三個位元組的資料,每個位元組都不能出現0,所以用char*表示utf8編碼的資料至少在有字母和中文的組合字串中不會因為遇到字元0而提前截斷字串的出錯。
而對於utf16,用char*就很危險。因為,字母a用utf16的編碼格式就是4100或者0041.(十六進製制形式;小端或者大端法表現為上面這兩種形式),char*在遇到00的時候會提前截斷字串,所以上面的函式
utf_8tounicode
的第乙個引數是
wchar_t*pout
,也是考慮到這種情況的。
multibytetowidechar
函式和widechartomultibyte
函式類似分析。
更複雜的格式根據需要採用,比如指標指向四個位元組等等。
參考**:
1、字元:
2、字元編碼:
%e7%bc%96%e7%a0%81
3、深入了解字符集和編碼問題::
4、unicode:
5、gb2312編碼:
6、字元編碼:
7、字元,位元組和編碼:
8、字元編碼詳解及由來(unicode,utf-8,gbk)[**]:9、
字元編譯碼的故事(ascii,ansi,unicode,utf-8)
:10、
ansi、unicode、utf8字串之間的轉換和寫入文字檔案
:11、
utf-8andunicodefaq
:12、
unicode和utf-8之間的轉換詳解
:
你想知道的負載均衡
本文 一篇文章徹底了解清楚什麼是負載均衡。負載均衡是高可用網路基礎架構的的乙個關鍵組成部分,有了負載均衡,我們通常可以將我們的應用伺服器部署多台,然後通過負載均衡將使用者的請求分發到不同的伺服器用來提高 應用 資料庫或其他服務的效能以及可靠性。為什麼要引入負載均衡?先看乙個沒有負載均衡機制的web架...
CLR中你想知道的事
clr是什麼?clr 公共語言執行時,是乙個可由多個語言共同使用的執行環境,核心 記憶體管理,程式集載入,安全性,異常處理和多執行緒 visual studio是一種編譯器,編譯器也可稱為語法檢查器和正確 的分析器 visual studio點選生成或除錯的時候幹了什麼?編譯器會生成乙個託管模組。託...
溢位 你想知道的C語言 3 7
q 溢位的本質是什麼?a 江河漫漫,才華會溢,箱子會滿,人會吃飽。無止境增加一定會滿,事物的有限性,物質和慾望增長一定會撐不住。q n位元組無符號整形最大值再加1會變成什麼?a 思考1位元組的情形 unsigned char c uchar max printf d n unsigned char ...