这几天些一段代码,使用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文件为何还有乱码的吧.
 
所以,通常如果你想保存文本到记事本中,通常情况下应该这么做:
 
 
    
  1. // Note, do not use css=UTF-8,否则,将以UTF-8大字节序保存,记事本打开是乱码,除非你以大字节序打开. 
  2. ASSERT(0 < nbytes); 
  3. FILE  *f = _tfopen(m_szTempFile, _T("a")); 
  4. ASSERT(NULL != f); 
  5. fwrite(utf8, 1, nbytes, f); 
  6. fclose(f); 
 
关于计算机字符编码有不少的好文章,下面几篇写的尤其不错,如果想要详细了解可以阅读下面几篇文章.
unicode,ANSI,UTF-8的故事(很风趣),
UNICODE,GBK,UTF-8区别,
编码问题的由来 相关概念的理解.
记事本不能保存"联通"两个字的原理("牛小伟"三个字也是如此)