字符串与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);
字符串与byte[]之间的转换的更多相关文章
- 编码和解码(字符串与byte[]之间的转换)
资源来自互联网http://www.cnblogs.com/dabaopku/archive/2012/02/27/2370446.html 非常蛋疼的事情, google 和 baidu 在编码是分 ...
- C# Stream 和 byte[] 之间的转换
一. 二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = ; Image img = Image.FromStream( ...
- Stream 和 byte[] 之间的转换
Stream 和 byte[] 之间的转换 一. 二进制转换成图片 ? 1 2 3 4 5 MemoryStream ms = new MemoryStream(bytes); ms.Position ...
- C# Stream 和 byte[] 之间的转换(文件流的应用)
一. 二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = ; Image img = Image.FromStream( ...
- 字符串与Objec之间互相转换
字符串与Objec之间互相转换可通过json实现. JSON.parse(str);// 字符串转Json Object JSON.stringify(obj);// Obj转字符串
- C#实现Stream与byte[]之间的转换实例教程
一.二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = ; Image img = Image.FromStream(m ...
- kotlin字符串和数字之间的转换和人机交互
继续基础学习~ 字符串和数字之间的转换 那如何转换呢,其实很简单: 编译木有报错,但是运行: 所以这里了解下. 人机交互 看这标题貌似高端的,其实也就是程序可以接受键盘的输入啦,下面开始: 首先提示用 ...
- C#字符串和数据之间的转换
c#中不仅仅存在数值类型的数据之间的转换,字符串和数值之间也是可以互相转换的,只是方法不同而已. 1 数值型转换为字符型 数值型数据转换为字符串用ToString()方法即可实现 int num1=1 ...
- 常见的时间字符串与timestamp之间的转换 时间戳
这里说的字符串不是一般意义上的字符串,是指在读取日期类型的数据时,如果还没有及时解析字符串,它就还不是日期类型,那么此时的字符串该怎么与时间戳之间进行转换呢? ① 时间字符串转化成时间戳 将时间字符串 ...
随机推荐
- git mv与直接mv的区别
git mv 行为: 1.创建一个和之前文件内容一样的文件,文件名为新的文件名 2.将原来的文件删除 3.将删除的文件添加到暂存区 4.将新建的文件添加到暂存区 $ git mv a a1 $ git ...
- php用类生成二维码
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq1355541448/article/details/28630289 百度云盘里面已经有了.引用 ...
- 【开发者笔记】java 利用jna调用c#的dll
一.需求阐述: 如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实现需 ...
- php微信支付回调验证
//字典排序拼接字符串 function getWxPaySignature($arr){ ksort($arr); $str = ''; foreach ($arr as $k=>$a){ $ ...
- cnn for qa
最近在做QA系统,用tensorflow做了些实验,下面的的是一个cnn的评分网络.主要参考了<APPLYING DEEP LEARNING TO ANSWER SELECTION: A STU ...
- MySQL学习之——锁(转)
锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或县城并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一 ...
- python手写bp神经网络实现人脸性别识别1.0
写在前面:本实验用到的图片均来自google图片,侵删! 实验介绍 用python手写一个简单bp神经网络,实现人脸的性别识别.由于本人的机器配置比较差,所以无法使用网上很红的人脸大数据数据集(如lf ...
- springBoot 整合 RabbitMQ 的坑
1.Consumer raised exception, processing can restart if the connection factory supports it. Exception ...
- python的最大递归层数
def foo(n): print(n) n += 1 foo(n) if __name__ == '__main__': foo(1) 打印出998,然后报错 RecursionError: max ...
- 【android】使用RecyclerView和CardView,实现知乎日报精致布局
完整代码,请参考我的博客园客户端,git地址:http://git.oschina.net/yso/CNBlogs 在写博客园客户端的时候,突然想到,弄个知乎日报风格的简单清爽多好!不需要那么多繁杂的 ...