UTF-8编码字符串:棰?,如何还原为GB2312字符串:题-

justduit 2010-11-08 09:46:25
原标题为:题-
通过项目里的FLASH组件,传递过来了UTF-8编码字符串:棰?
如何还原为GB2312编码字符串:题-
...全文
188 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gomoku 2010-11-08
  • 打赏
  • 举报
回复
没有“UTF-8编码字符串”这种说法。可以说“UTF-8编码字节串”。

.net的字符串都是UTF-16编码的。
某些组合是不被UTF-16认可的,所以,不是任何的字节串都能用.net的字符串表示的。
justduit 2010-11-08
  • 打赏
  • 举报
回复

protected void Page_Load(object sender, EventArgs e)
{
string title = "北-";
string utf = TransGB2312ToUTF8(title);
Response.Write(string.Format("gb title : {0}", title));
Response.Write("<br />");
Response.Write(string.Format("utf title : {0}", utf));
Response.Write("<br />");
Response.Write(string.Format("trans title : {0}", Trans(utf)));
Response.Write("<br />");
Response.Write(string.Format("trans first title : {0}", TransFirst(utf)));
Response.Write("<br />");
Response.Write(string.Format("trans second title : {0}", TransSecond(utf)));
Response.Write("<br />");
title = "北京";
utf = TransGB2312ToUTF8(title);
Response.Write(string.Format("gb title : {0}", title));
Response.Write("<br />");
Response.Write(string.Format("utf title : {0}", utf));
Response.Write("<br />");
Response.Write(string.Format("trans title : {0}", Trans(utf)));
Response.Write("<br />");
Response.Write(string.Format("trans first title : {0}", TransFirst(utf)));
Response.Write("<br />");
Response.Write(string.Format("trans second title : {0}", TransSecond(utf)));
Response.Write("<br />");
}

/// <summary>
/// GB2312转UTF8
/// </summary>
/// <param name="input">源字符串</param>
/// <returns></returns>
public string TransGB2312ToUTF8(string input)
{
string reResult = string.Empty;
Encoding gb = Encoding.GetEncoding("gb2312");
byte[] bt = Encoding.Convert(Encoding.Default, Encoding.UTF8, gb.GetBytes(input));
reResult = gb.GetString(bt);
return reResult;
}

/// <summary>
/// UTF8转GB2312
/// </summary>
/// <param name="input">源字符串</param>
/// <returns></returns>
public string Trans(string input)
{
string res = input;
UTF8Encoding utf = new UTF8Encoding();
byte[] bt = Encoding.Convert(Encoding.UTF8, Encoding.Default, utf.GetBytes(res));
res = utf.GetString(bt);
return res;
}


/// <summary>
/// UTF8转GB2312(方法一)
/// </summary>
/// <param name="input">源字符串</param>
/// <returns></returns>
public string TransFirst(string input)
{
string res = input;
byte[] dest = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("GB2312"), Encoding.UTF8.GetBytes(res));
res = Encoding.GetEncoding("GB2312").GetString(dest);
return res;
}

/// <summary>
/// UTF8转GB2312(方法二)
/// </summary>
/// <param name="input">源字符串</param>
/// <returns></returns>
public string TransSecond(string input)
{
string res = input;
res = Encoding.GetEncoding("GB2312").GetString(Encoding.UTF8.GetBytes(res));
return res;
}


以上输出结果为:
gb title : 北-
utf title : 鍖?
trans title : ??
trans first title : 鍖?
trans second title : 閸?
gb title : 北京
utf title : 鍖椾含
trans title : 北京
trans first title : 鍖椾含
trans second title : 閸栨ぞ鍚?

当原字符串为偶数个中文时,用Trans方法可以还原回去
当原字符串为奇数个中文+字母|符号|数字,所有的方法都不能还原回去

这是否在转码的过程当中丢失了数据?
qqiuzaihui 2010-11-08
  • 打赏
  • 举报
回复
            string name = Encoding.GetEncoding("GB2312").GetString(Encoding.UTF8.GetBytes(yourUtf8String));
justduit 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyazhe 的回复:]

C# code
byte[] dest = Encoding.Convert(Encoding.UTF8,Encoding.GetEncoding("GB2312"),Encoding.UTF8.GetBytes(yourUtf8String));
string result = Encoding.GetEncoding("GB2312").GetString(dest);
[/Quote]

使用后,输出结果还是:棰?,没有还原回去。
兔子-顾问 2010-11-08
  • 打赏
  • 举报
回复
byte[] dest = Encoding.Convert(Encoding.UTF8,Encoding.GetEncoding("GB2312"),Encoding.UTF8.GetBytes(yourUtf8String));
string result = Encoding.GetEncoding("GB2312").GetString(dest);

111,129

社区成员

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

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

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