字符串与byte[]之间的转换

字符串与byte[]之间的转换 一、 编码 同一个字符在不同的编码下会被编成不同长度的编码,比如: ACSII,每个字符对应一个字节,实际上只使用了7位,从00h-7Fh。只能表达128个字符。 GB2312,中文的一种编码,每个字符使用两个字节表示。 UTF-8, 可以表达所有unicode字符,每个字符可以用1-3个字节表示。 UTF-16, 可以表达所有unicode字符,每个字符可以用1-2个16位整数表示。 UTF-32, 可以表达所有unicode字符,每个字符可以用1个32位整数表示。 Windows内部支持以下编码: Code Page Name Display Name 936 gb2312 Chinese Simplified (GB2312) 1149 IBM01149 IBM EBCDIC (Icelandic-Euro) 1200 utf-16 Unicode 1201 unicodeFFFE Unicode (Big-Endian) 1252 Windows-1252 Western European (Windows) 10003 x-mac-korean Korean (Mac) 10008 x-mac-chinesesimp Chinese Simplified (Mac) 20127 us-ascii US-ASCII 20936 x-cp20936 Chinese Simplified (GB2312-80) 20949 x-cp20949 Korean Wansung 28591 iso-8859-1 Western European (ISO) 28598 iso-8859-8 Hebrew (ISO-Visual) 38598 iso-8859-8-i Hebrew (ISO-Logical) 50220 iso-2022-jp Japanese (JIS) 50221 csISO2022JP Japanese (JIS-Allow 1 byte Kana) 50222 iso-2022-jp Japanese (JIS-Allow 1 byte Kana - SO/SI) 50225 iso-2022-kr Korean (ISO) 50227 x-cp50227 Chinese Simplified (ISO-2022) 51932 euc-jp Japanese (EUC) 51936 EUC-CN Chinese Simplified (EUC) 51949 euc-kr Korean (EUC) 52936 hz-gb-2312 Chinese Simplified (HZ) 54936 GB18030 Chinese Simplified (GB18030) 57002 x-iscii-de ISCII Devanagari 57003 x-iscii-be ISCII Bengali 57004 x-iscii-ta ISCII Tamil 57005 x-iscii-te ISCII Telugu 57006 x-iscii-as ISCII Assamese 57007 x-iscii-or ISCII Oriya 57008 x-iscii-ka ISCII Kannada 57009 x-iscii-ma ISCII Malayalam 57010 x-iscii-gu ISCII Gujarati 57011 x-iscii-pa ISCII Punjabi 65000 utf-7 Unicode (UTF-7) 65001 utf-8 Unicode (UTF-8) 65005 utf-32 Unicode (UTF-32) 65006 utf-32BE Unicode (UTF-32 Big-Endian) 目前Windows的内核已经采用Unicode编码,这样在内核上可以支持全世界所有的语言文字。但是由于现有的大量程序和文档都采用了某种特定语言的编码,例如gb2312,Windows不可能不支持现有的编码,而全部改用Unicode。 Windows使用上面表格所示的代码页(code page)来适应各个国家和地区。Windows使用默认代码页来表示当前操作系统的使用的语言,这可以在控制面板的“区域和语言选项”中选择。一般中文windows操作系统,选择“中文(中国)”,这样设置,windows的默认代码页就是936,即gb2312。 Windows按照当前的缺省代码页去解释文本文件里的字节流。缺省代码页可以通过控制面板的区域选项设置。记事本的另存为中有一项ANSI,其实就是按照缺省代码页的编码方法保存。 Windows的内码是Unicode,它在技术上可以同时支持多个代码页。只要文件能说明自己使用什么编码,用户又安装了对应的代码页,Windows就能正确显示,例如在HTML文件中就可以指定charset。 字节序 UTF-8是单字节的编码,不用考虑字节顺序,但是UTF-16和UTF-32是16位和32位的编码,每个编码内部都有个字节顺序的问题。比如字符”A” (U+0041),在序列化时是”00”在前还是”41”在前,这就有两种可能。 UTF-16 big-endian byte order: 00 41 UTF-16 little-endian byte order: 41 00 规范规定了一个可选的方案,就是在编码前导几个字符放上本身不是UTF可能编码的前导编码来帮助判断识别。 UTF-8: EF BB BF UTF-16 big-endian byte order: FE FF UTF-16 little-endian byte order: FF FE UTF-32 big-endian byte order: 00 00 FE FF UTF-32 little-endian byte order: FF FE 00 00 二、 需要把string转换为byte[]使用的场景 任何需要把string序列化处理都需要这种转换,比如: 需要把string保存到文件中,必须把string转换成一个有序的字节流,以便系统在硬盘上做物理保存。 对string做加密操作时,加密算法是针对字节进行处理,这时也需要把string转换成字节流以便加密算法对数据进行处理。 String到字节流的转换涉及到使用何种编码,使用不同的编码得到的字节码不同,再从字节码做反操作恢复成string,必须使用编码时使用的编码或者兼容的编码,否则结果就是乱码。 三、 string转换为byte []的操作 1、 确定使用的编码 使用Encoding类的静态方法GetEncoding方法获得某个类型的Encoding对象。 l public static Encoding.GetEncoding(int codepage) codepage指定这种返回代码页的Encoding l public static Encoding GetEncoding (string name) name 指定这种返回代码名的Encoding 其中使用到的代码页和代码名在上面表中。 比如要获得一个utf-8的Encoding对象 Encoding myEncoding = Encoding.GetEncoding("utf-8"); 2、 从string到byte[] string sData = “字符串”; byte[] myByte = myEncoding.GetBytes(sData); 使用GetBytes方法时,不产生前面所说的识别不同UTF格式的前导符。 3、 从byte[]到string byte[] myByte = new byte[]{}; string sData = myEncoding.GetString(byte[] myByte);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值