c# utf8编码问题

Amy安 2018-12-24 04:33:40
客户端 windows utf-8编码

public static string signData(string sdata)
{
byte[] data = Encoding.UTF8.GetBytes(sdata);

priRSA = new RSACryptoServiceProvider();
priRSA.FromXmlString(NET_PRIVATE_KEY);

byte[] endata = priRSA.SignData(data, "SHA1");

return Convert.ToBase64String(endata);

}



String sdata = "0600001|5115013356|150|张三|1|1.0";

String sSigndata = signData(sdata)

sHtml += "<input type=\"text\" name=\"signature\" value=\"" + sSigndata+ "\"/> ";



将sHtml放入form表单 提交
<form id="form" style="display:none;" accept-charset="utf-8" onsubmit="document.charset='utf-8'" >
<input type="text" name="signature" value="AuAsxxxxxxxxxWg="/>
</form>



服务端 linux utf-8编码
将signature解密后得到
0600001|5115013356|150|???|1|1.0

中文乱码

将sdata,sSigndata,或是组成sdata的变量进行转utf8编码操作后 仍然如此
请教是哪里的问题

虽然一边是windows一边是linux 但两边一直以来的编码都是utf-8 在客户端这边写日志文件,文件也是utf8的,打开显示都是正常的,客户端提交客户端接收也是正常的,并且试过转gbk就乱码,可以确定客户端是utf-8的,为什么到了服务端接收的就成了乱码呢

转utf8 尝试过这些

public static string get_uft8(string unicodeString)
{
1.
UTF8Encoding utf8 = new UTF8Encoding();
Byte[] encodedBytes = utf8.GetBytes(unicodeString);
String decodedString = utf8.GetString(encodedBytes);
return decodedString;
2.
//byte[] buffer = Encoding.UTF8.GetBytes(unicodeString);
//return Encoding.GetEncoding("utf-8").GetString(buffer);
3.
//byte[] buffer1 = Encoding.Default.GetBytes(unicodeString);
//byte[] buffer2 = Encoding.Convert(Encoding.Default, Encoding.UTF8, buffer1, 0, buffer1.Length);
//return Encoding.Default.GetString(buffer2, 0, buffer2.Length);

}
...全文
451 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Amy安 2018-12-24
  • 打赏
  • 举报
回复
文字整理错了。。

signature是加密签名 signedData是明文
明文是form表单中除signature这个input以外的其他input的值 用“|”隔开的字符串
Amy安 2018-12-24
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
解密函数呢?




public static bool verifySignature(string signature, string signedData)
{
byte[] sign = Convert.FromBase64String(signature);
return verify(sign, signedData);
}

public static bool verify(byte[] signature, string signedData)
{
try
{

pubRSA = new RSACryptoServiceProvider();
pubRSA.FromXmlString(NET_PUBLIC_KEY);

//byte[] hash = Convert.FromBase64String(signedData);
byte[] hash = Encoding.UTF8.GetBytes(signedData);
if (pubRSA.VerifyData(hash, "SHA1", signature))
{
return true;
}
else
{
//Console.WriteLine("The signature is not valid.");
return false;
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return false;
}
}



string signature, string signedData
signature是加密签名 signedData是明文 明文是form表单中signature这个input的值 同时form表单中有其他参数 signedData就是不包含signature的所有的参数值 用“|”隔开的字符串
signedData中的中文是正常的,是由form表单中input直接传的
Amy安 2018-12-24
  • 打赏
  • 举报
回复
引用 1 楼 cheng2005 的回复:
UTF8Encoding utf8 = new UTF8Encoding(false);

试试这个



UTF8Encoding utf8 = new UTF8Encoding(false);
Byte[] encodedBytes = utf8.GetBytes(unicodeString);
String decodedString = utf8.GetString(encodedBytes);
return decodedString;


用这个转了也不行 还是一样的乱码
xuzuning 2018-12-24
  • 打赏
  • 举报
回复
解密函数呢?
cheng2005 2018-12-24
  • 打赏
  • 举报
回复
UTF8Encoding utf8 = new UTF8Encoding(false);

试试这个

110,535

社区成员

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

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

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