计算机内存和文件中的UNICODE字符

简介:
这几天些一段代码,使用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); 
 
关于计算机字符编码有不少的好文章,下面几篇写的尤其不错,如果想要详细了解可以阅读下面几篇文章.
记事本不能保存"联通"两个字的原理("牛小伟"三个字也是如此)











本文转自jetyi51CTO博客,原文链接: http://blog.51cto.com/jetyi/762687 ,如需转载请自行联系原作者



相关文章
|
1月前
|
C语言
模拟实现C语言中经典库函数,字符相关的函数与内存相关的函数
模拟实现C语言中经典库函数,字符相关的函数与内存相关的函数
模拟实现C语言中经典库函数,字符相关的函数与内存相关的函数
|
3月前
牛牛的计算机内存(状压dp)
牛牛的计算机内存(状压dp)
22 0
|
4月前
|
C语言 C++
『C语言进阶』字符函数和内存函数(2)
『C语言进阶』字符函数和内存函数(2)
|
4月前
|
程序员 编译器 C语言
『C语言进阶』字符函数和内存函数(1)
『C语言进阶』字符函数和内存函数(1)
|
6月前
【字符串函数、字符函数和内存操作函数】
【字符串函数、字符函数和内存操作函数】
20 0
|
5月前
|
Unix 程序员 Linux
【OSTEP】动态内存开辟 | 内存API常见错误 | UNIX: brk/sbrk 系统调用 | mmap创建匿名映射区域 | mmap创建以文件为基础的映射区域
【OSTEP】动态内存开辟 | 内存API常见错误 | UNIX: brk/sbrk 系统调用 | mmap创建匿名映射区域 | mmap创建以文件为基础的映射区域
173 0
|
4月前
|
编译器 C语言 C++
C语言字符串函数,字符函数,内存操作函数
C语言字符串函数,字符函数,内存操作函数
132 0
|
3月前
|
存储 缓存 Java
释放C盘空间:释放Windows休眠文件和关闭虚拟内存
在 Windows 11 专业版中,可以通过以下步骤来释放休眠文件(Hibernate File),以释放磁盘空间。休眠文件是系统休眠(Hibernate)功能所需要的文件,它保存了系统的当前状态,以便在休眠状态下恢复。如果你不使用休眠功能,如果因为C盘空间不足,可以考虑释放这个文件来腾出磁盘空间。
3514 0
|
1月前
|
C语言
【C语言进阶】字符函数和内存函数(二)
【C语言进阶】字符函数和内存函数(二)
|
1月前
|
C语言 C++
【C语言进阶】字符函数和内存函数 (一)
【C语言进阶】字符函数和内存函数 (一)

热门文章

最新文章