這幾天些一段代碼,使用tinyxml讀寫xml檔案,發現讀寫中文時總會出現亂碼,然後認真研究了一下UNICODE字元編碼問題,然後總結了一下,用一段簡短的文字描述一下原因.
Unicode也是一種字元編碼方法,不過它是由國際組織設計,可以容納全世界所有語言文字的編碼方案。Unicode的學名是"Universal Multiple-Octet Coded Character Set",簡稱為UCS。UCS可以看作是"Unicode Character Set"的縮寫。也就是說,采用這種編碼方式後,世界上所有的語言字元都有一個UNICODE編碼(一個數字).
UNICODE雖然為所有語言雖有字元都編了一個号,但是它并未規定如何存儲,傳輸這些UNICODE字元,例如對于"中a",可以采用UNICODE編碼來存儲,這樣它将占用4個位元組,但其實字元"a"用一個位元組就可以表示,字元"中"才需要兩個位元組表示,這樣可以節省50%的空間,呵呵,如果在考慮到大位元組序,小位元組序等等,這樣又可以産生不少編碼變種,例如UTF-8,UTF-16等等,隻要軟體能夠識别它們就可以了.
計算機采用UNICODE之後,記憶體中并不存放UNICODE字元的編碼, 而是存放字元在UNICODE字元集中的序号(如果是ANSI字元,它們的序号和UNICODE編碼相同).
如果字元串中的字元在記憶體中是以"UNICODE字元集中的序号"存在,就稱之為UNICODE字元串或者寬位元組字元,函數MultiByteToWideChar就是幹這個事情的.如果你想将寬位元組字元串儲存到UNICODE檔案中,就必須先将其轉換為相應的UNICODE字元編碼,然後才能儲存,例如你的檔案采用的是UTF-8(一種UNICODE編碼),儲存寬位元組時必須首先将其轉換為UTF-8編碼,然後在儲存,WideCharToMultiByte就幹這個事情.
現在你知道為何讀寫XML或HTML檔案為何還有亂碼的吧.
是以,通常如果你想儲存文本到記事本中,通常情況下應該這麼做:
// Note, do not use css=UTF-8,否則,将以UTF-8大位元組序儲存,記事本打開是亂碼,除非你以大位元組序打開.
ASSERT(0 < nbytes);
FILE *f = _tfopen(m_szTempFile, _T("a"));
ASSERT(NULL != f);
fwrite(utf8, 1, nbytes, f);
fclose(f);
關于計算機字元編碼有不少的好文章,下面幾篇寫的尤其不錯,如果想要詳細了解可以閱讀下面幾篇文章.
本文轉自jetyi51CTO部落格,原文連結: http://blog.51cto.com/jetyi/762687,如需轉載請自行聯系原作者