漫谈NET开发中的字符串编码.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
漫谈NET开发中的字符串编码

漫谈.NET开发中的字符串编码说明:???????? 在《.NET 4.0面向对象编程漫谈》基础篇《13.2.1 序列化与流》中,向大家介绍了如何向流中序列化一个对象。???????? 本篇扩充阅读将向读者介绍将字符串对象的序列化,这里面的关键是字符串应该如何编码和解码为二进制数值,从而可以把它们保存到文件流(FileStream)中,或者通过网络流(NetworkStream)将它们远程发送到另一台计算机上。?============================================================== ?????? ?1 引子???????? 在实际开发中,经常需要将一些字符串写入到文本文件中,或者从文本文件中读入字符串,在.NET应用程序中,通常使用StreamReader或StreamWriter两个类完成这一工作,比如以下代码将fileContent字串写入到FileName文件中:static?void?WriteFileUseStreamWriter(String?fileContent,?String?FileName){  using?(StreamWriter?writer?=?new?StreamWriter(FileName))  {    writer.Write(fileContent);  }}????????? 如果你使用.NET基类库中相关类(比如StreamReader或下面用到的File类)去读取这个文件,你会发现一切如你所愿地正常运转:?WriteFileUseStreamWriter(中国ab,?test.txt);Console.WriteLine(File.ReadAllText(test.txt));?????//输出:“中国ab”?????????? ? ? 由于多数情况下我们都工作在中文Windows下,而且往往都是某个.NET程序写,另一个.NET程序读,所以,不少.NET程序员可能都没注意到这其中其实存在着一个字符编码的问题,在特定的场合下,这一问题会给我们带来麻烦。???????? 请看图1:?图1 记事本支持的编码方式????????? 默认情况下,Windows记事本以ANSI编码方式保存文件。如图1所示,如果文本内容为“中国ab”,记事本将其以ASNI方式保存为“test.txt”,则以下代码将“罢工”了(参看图2):?Console.WriteLine(File.ReadAllText(test.txt));?????? 图2 汉字将显示为乱码????????? 如图 2所示,File.ReadAllText方法打开“test.txt”文件时,会发现英文字符可以正常显示,但中文将显示为乱码。?2 了解字符的编码???????? 我们可以做个试验,使用记事本将“中国ab”这个中英混杂的字符串以不同编码方式保存为多个“.txt”文件,然后直接查看其二进制内容:???图3? 比对字符编码????????? 图 3展示了“中国ab”按四种编码方式(ANSI、UTF8、Unicode、Unicode Big Endian)得到的不同二进制数据。???????? 以英文字符“a”为例,ANSI和UTF8得到的数值都是“61”,但Unicode将它扩充为2个字节16位的二进制(“61 00”和“00 61”),所以我们又将这种编码方式称为UTF-16。???????? UTF-16又可以细分为2种编码方式:Big Endian方式与Little_Edian方式,这两者的唯一区别在于字节排列顺序刚好相反,Little_Edian方式将“a”编码为“61 00”,而Big Endian方式则编码为“00 61”。???????? 现在看看中文字符,“中国”两个汉字,ANSI编码为“D6 D0 B9 FA”,4个字节,一个汉字占两个字节,而UTF8则编码为“E4 B8 AD E5 9B BD”,6个字节,一个汉字占3个字节!这说明UTF8是一种“变长”的编码,可能使用1~4个字节来表示某个字符。???????? 另外,我们看到UTF8和Unicode编码(不管是Big Endian还是Little Endian)前面都有几个标记字符,这些字符放在文本文件的开头,称为“BOM(Byte Order Mark,字节顺序标记)”指明了文本的编码方式,以下是.NET程序中常见的字符编码方式的BOM值:?编码BOM值UTF-8EF BB BFUTF-16 ?big endianFE FFUTF-16 ?little endianFF FEUTF-32 ?big endian00 00 FE FFUTF-32 ?little endianFF FE 00 00??

文档评论(0)

shenlan118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档