计算机内存和文件中的UNICODE字符-阿里云开发者社区

开发者社区> 技术小甜> 正文

计算机内存和文件中的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,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云函数计算发送短信单文件轻量版
本文实现了使用阿里云《函数计算》+《短信服务》发送短信的简单功能,官方短信服务SDK功能全面,但较为冗杂,二爷精简了官方SDK,实现了一段代码(单文件)发送短信的功能。 阅读本文,你需要先了解阿里云函数计算、阿里云短信服务的基本常识。 试用本代码,需要预先在短信服务中申请短信签名、短信模板。
2329 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
6911 0
使用函数计算打包下载OSS文件
需求 打包下载OSS上存储的多个文件 方案 使用函数计算先把多个文件压缩成一个zip,存储到OSS上面,返回zip文件的地址,客户端下载此文件。 函数代码下载zip-oss.zip 实现细节 函数运行环境的磁盘空间是有限的,采用流式下载和上传的方式,只在内存中缓存少量的数据。
8439 0
[Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html  这个可以实现ImageView异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画。
830 0
使用.NET FrameWork获取CPU,内存使用率以及磁盘空间
原文:使用.NET FrameWork获取CPU,内存使用率以及磁盘空间       在以前,我们想获取CPU,内存等信息就不得不借助win32 API来实现。但现在,.NET FrameWork已经把这些API封装到.NET类库中了,所以我们可以借助.NET类库很轻松的获取这些信息。
806 0
Xcode生成的可执行文件在哪里!
       很多iphone、ipad、xcode、mac os x初学者编了半天程序,结果找不到生成的可执行文件在哪里。实际上生成可发布的可执行程序需要进行一些设置。
883 0
+关注
6323
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载