System.Text.Encoding.UTF8转换

wangcm888 2009-06-10 11:52:44
String s1= System.Text.Encoding.UTF8.GetString(new byte[] {21,21,199,94,233,144,217,27 });
//s1="^"
byte[] bytes=System.Text.Encoding.UTF8.GetBytes(s1);
//bytes={21,21,94,27};
String S2=System.Text.Encoding.UTF8.GetString(bytes);
//S2="^"

将一个字节数组转换为字符串,同时将转换过来的字符串转换回字节数组时怎么出现为不同的byte[],
而将此byte[]转换为字符串,还是原来那字符串(即S2=S1,而new byte[]!=bytes,怎样才能得到将字符串转换为原来的字节数组。
...全文
1117 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
evaa006 2009-06-10
  • 打赏
  • 举报
回复
1楼对,用Convert.ToBase64String(); 这个应该可以的
zgke 2009-06-10
  • 打赏
  • 举报
回复
无法获取到原来的了.. String s1= System.Text.Encoding.UTF8.GetString(new byte[] {21,21,199,94,233,144,217,27 }); 这行的数据就不正确了



你可以考虑Base64
Convert.ToBase64String();
Convert.FromBase64String();
烈火蜓蜻 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Linux7985 的回复:]
引用楼主 wangcm888 的帖子:
String s1= System.Text.Encoding.UTF8.GetString(new byte[] {21,21,199,94,233,144,217,27 });
//s1="^"
byte[] bytes=System.Text.Encoding.UTF8.GetBytes(s1);
//bytes={21,21,94,27};
String S2=System.Text.Encoding.UTF8.GetString(bytes);
//S2="^"

将一个字节数组转换为字符串,同时将转换过来的字符串转换回字节数组时怎么出现为不同的byte[],
而将此byte[]转换为字…
[/Quote]

现在发现,每次发贴,都会出现点错误,上面的贴有错误,我自己更正一下

UTF-8编码规则是这样的

如果一个字符串是三个字节的编码,那这个字符就应该是以下的BIT位 表示法
就是这样:

1110XXXX 10XXXXXX 10XXXXXX

如果是双字节的编码则是

110XXXXX 10XXXXXX

单字节字符就是这样的
0XXXXXXX

当如果出现这样
110XXXXX 0XXXXXXX
或是
0XXXXXXX 10XXXXXX
或是
110XXXXX 110XXXXX
这样他都是不合法的字符串

字符的起始字符是
1110XXXX 表示这个字符是由三个字节组成,这是第一个字节
111110XX 表示这个字符是由五个字节组成,这是第一个字节
0XXXXXXX 表示这个字符是由1个字节组成

10XXXXXX 表示这个字节只是一个字符的组成字节,他不能做为字符的第一个字节


jinlingoo1 2009-06-10
  • 打赏
  • 举报
回复
我在做简体的C/S软件时,也有过这样的问题,
建议,不要指定编码.写Encoding.Default.默认方式吧
烈火蜓蜻 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 wangcm888 的帖子:]
String s1= System.Text.Encoding.UTF8.GetString(new byte[] {21,21,199,94,233,144,217,27 });
//s1="^"
byte[] bytes=System.Text.Encoding.UTF8.GetBytes(s1);
//bytes={21,21,94,27};
String S2=System.Text.Encoding.UTF8.GetString(bytes);
//S2="^"

将一个字节数组转换为字符串,同时将转换过来的字符串转换回字节数组时怎么出现为不同的byte[],
而将此byte[]转换为字符串,还是原来那字符串(即S…
[/Quote]

你的第一个字节数组在转换为字符串的时候,因为,不是合法的Utf-8,所以基本都被过滤了,只剩下,合法的字符串,所以,你再转回去的时候,就少了那些不合法的字节,所以才会不一样,
如果你想不被过滤的话,要么考虑用扩展的ASCII码来转换成字符串,就OK了,或者用其它的算法,如 Base64

[code=MSIL]UTF-8编码规则是这样的

如果一个字符串是三个字节的编码,那这个字符就应该是以下的BIT位 表示法
就是这样:

0XXXXXXX 10XXXXXX 110XXXXX

如果是双字节的编码则是

0XXXXXXX 10XXXXXX

当如果出现这样
0XXXXXXX 110XXXXX
或是
0XXXXXXX 10XXXXXX 11110XXX
或是
0XXXXXXX 110XXXXX 10XXXXXX
这样他都是不合法的字符串

在UTF-8中都是以 0XXXXXXX 这样的字节做为一个字符的开始[/code]
WuZongBo 2009-06-10
  • 打赏
  • 举报
回复
String s1= System.Text.Encoding.UTF8.GetString(new byte[] {21,21,199,94,233,144,217,27 });
你给的byte根本不能被正确编码,编码时候被省略了。所以你再编码回去就不对;


你用一个正确的字符串数组才行;
byte[] bytes = System.Text.Encoding.UTF8.GetBytes("abcd");

lvxianda 2009-06-10
  • 打赏
  • 举报
回复
byte[] bytesOld = new byte[] { 21, 21, 199, 94, 233, 144, 217, 27 };
string aaa = bytesOld.ToString();

String s1 = System.Text.Encoding.ASCII.GetString(bytesOld);
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(s1);
String S2 = System.Text.Encoding.UTF8.GetString(bytes);

改成ASCII byte[]内容一样

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧