您的位置:首页 > 其它

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

2008-02-16 15:06 204 查看
一、 编码
同一个字符在不同的编码下会被编成不同长度的编码,比如:
ACSII,每个字符对应一个字节,实际上只使用了7位,从00h-7Fh。只能表达128个字符。
GB2312,中文的一种编码,每个字符使用两个字节表示。
UTF-8, 可以表达所有unicode字符,每个字符可以用1-3个字节表示。
UTF-16, 可以表达所有unicode字符,每个字符可以用1-2个16位整数表示。
UTF-32, 可以表达所有unicode字符,每个字符可以用1个32位整数表示。

Windows内部支持以下编码:
[align=center]Code Page[/align]
[align=center]Name[/align]
[align=center]Display Name[/align]
[align=left]936 [/align]
[align=left]gb2312 [/align]
[align=left]Chinese Simplified (GB2312) [/align]
[align=left]1149 [/align]
[align=left]IBM01149 [/align]
[align=left]IBM EBCDIC (Icelandic-Euro) [/align]
[align=left]1200 [/align]
[align=left]utf-16 [/align]
[align=left]Unicode [/align]
[align=left]1201 [/align]
[align=left]unicodeFFFE [/align]
[align=left]Unicode (Big-Endian) [/align]
[align=left]1252 [/align]
[align=left]Windows-1252 [/align]
[align=left]Western European (Windows) [/align]
[align=left]10003 [/align]
[align=left]x-mac-korean [/align]
[align=left]Korean (Mac) [/align]
[align=left]10008 [/align]
[align=left]x-mac-chinesesimp [/align]
[align=left]Chinese Simplified (Mac) [/align]
[align=left]20127 [/align]
[align=left]us-ascii [/align]
[align=left]US-ASCII [/align]
[align=left]20936 [/align]
[align=left]x-cp20936 [/align]
[align=left]Chinese Simplified (GB2312-80) [/align]
[align=left]20949 [/align]
[align=left]x-cp20949 [/align]
[align=left]Korean Wansung [/align]
[align=left]28591 [/align]
[align=left]iso-8859-1 [/align]
[align=left]Western European (ISO) [/align]
[align=left]28598 [/align]
[align=left]iso-8859-8 [/align]
[align=left]Hebrew (ISO-Visual) [/align]
[align=left]38598 [/align]
[align=left]iso-8859-8-i [/align]
[align=left]Hebrew (ISO-Logical) [/align]
[align=left]50220 [/align]
[align=left]iso-2022-jp [/align]
[align=left]Japanese (JIS) [/align]
[align=left]50221 [/align]
[align=left]csISO2022JP [/align]
[align=left]Japanese (JIS-Allow 1 byte Kana) [/align]
[align=left]50222 [/align]
[align=left]iso-2022-jp [/align]
[align=left]Japanese (JIS-Allow 1 byte Kana - SO/SI) [/align]
[align=left]50225 [/align]
[align=left]iso-2022-kr [/align]
[align=left]Korean (ISO) [/align]
[align=left]50227 [/align]
[align=left]x-cp50227 [/align]
[align=left]Chinese Simplified (ISO-2022) [/align]
[align=left]51932 [/align]
[align=left]euc-jp [/align]
[align=left]Japanese (EUC) [/align]
[align=left]51936 [/align]
[align=left]EUC-CN [/align]
[align=left]Chinese Simplified (EUC) [/align]
[align=left]51949 [/align]
[align=left]euc-kr [/align]
[align=left]Korean (EUC) [/align]
[align=left]52936 [/align]
[align=left]hz-gb-2312 [/align]
[align=left]Chinese Simplified (HZ) [/align]
[align=left]54936 [/align]
[align=left]GB18030 [/align]
[align=left]Chinese Simplified (GB18030) [/align]
[align=left]57002 [/align]
[align=left]x-iscii-de [/align]
[align=left]ISCII Devanagari [/align]
[align=left]57003 [/align]
[align=left]x-iscii-be [/align]
[align=left]ISCII Bengali [/align]
[align=left]57004 [/align]
[align=left]x-iscii-ta [/align]
[align=left]ISCII Tamil [/align]
[align=left]57005 [/align]
[align=left]x-iscii-te [/align]
[align=left]ISCII Telugu [/align]
[align=left]57006 [/align]
[align=left]x-iscii-as [/align]
[align=left]ISCII Assamese [/align]
[align=left]57007 [/align]
[align=left]x-iscii-or [/align]
[align=left]ISCII Oriya [/align]
[align=left]57008 [/align]
[align=left]x-iscii-ka [/align]
[align=left]ISCII Kannada [/align]
[align=left]57009 [/align]
[align=left]x-iscii-ma [/align]
[align=left]ISCII Malayalam [/align]
[align=left]57010 [/align]
[align=left]x-iscii-gu [/align]
[align=left]ISCII Gujarati [/align]
[align=left]57011 [/align]
[align=left]x-iscii-pa [/align]
[align=left]ISCII Punjabi [/align]
[align=left]65000 [/align]
[align=left]utf-7 [/align]
[align=left]Unicode (UTF-7) [/align]
[align=left]65001 [/align]
[align=left]utf-8 [/align]
[align=left]Unicode (UTF-8) [/align]
[align=left]65005 [/align]
[align=left]utf-32 [/align]
[align=left]Unicode (UTF-32) [/align]
[align=left]65006 [/align]
[align=left]utf-32BE [/align]
[align=left]Unicode (UTF-32 Big-Endian) [/align]
目前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);

3、从byte[]到string
byte[] myByte = new byte[]{};
string sData = myEncoding.GetString(byte[] myByte);

使用GetBytes方法时,不产生前面所说的识别不同UTF格式的前导符。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: