C# 对URL进行UTF-8编码 编码时为啥会把中文后面的第一个字母也转成了UTF-8呢?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 对URL进行UTF-8编码 编码时为啥会把中文后面的第一个字母也转成了UTF-8呢?相关的知识,希望对你有一定的参考价值。
UTF8Encoding utf8 = new UTF8Encoding();
Byte[] encodedBytes = utf8.GetBytes(url);//编码
StringBuilder sb = new StringBuilder();
for (int i = 0; i < encodedBytes.Length; i++)
if (encodedBytes[i] < 128)
sb.Append((char)encodedBytes[i]);
else
sb.Append("%" + encodedBytes[i++].ToString("X").PadLeft(2, '0'));
sb.Append("%" + encodedBytes[i].ToString("X").PadLeft(2, '0'));
return sb.ToString();
以上代码等同于Server.UrlEncode("这是test") //结果%e8%bf%99%e6%98%aftest
%af是整体 %后有两位
解码方法
Server.UrlEncode("%e8%bf%99%e6%98%aftest ")追问
你好,我这里是没有Server.UrlEncode这个方法的,要不然我也不会那么烦啊,
比如:QTP中DataTable操作大全,编码后是QTP%E4%B8%AD%44ataTable%E6%93%8D%E4%BD%9C%E5%A4%A7%E5%85%A8,注意一下,QTP是可以的,可是那个DataTable中的D就转成%44了!!应该是:QTP%E4%B8%ADDataTable%E6%93%8D%E4%BD%9C%E5%A4%A7%E5%85%A8才对吧!就是所有中文后面的第一个都是这样,可是字母在前面又没问题,愁
用这个吧
如何在 C# 中对字符串进行 URL 编码
【中文标题】如何在 C# 中对字符串进行 URL 编码【英文标题】:How to URL encode strings in C# 【发布时间】:2014-03-27 15:46:31 【问题描述】:我们如何在 C# 中使用 URL (RFC 1738) 标准对字符串进行编码?
以下在线工具正在使用此标准 http://www.freeformatter.com/url-encoder.html 转换字符串
我要转换的字符串示例是test(brackets)
,编码后的字符串应如下所示:
test%28brackets%29
【问题讨论】:
URL Encoding using C#的可能重复 【参考方案1】:Uri.EscapeDataString
做你想做的事。见MSDN。
【讨论】:
对不起,它不起作用。试过这个字符串 str = "test(brackets)"; str = Uri.EscapeDataString(str); 奇怪。当我尝试 "string result = Uri.EscapeDataString("test(brackets)");"结果是“test%28brackets%29”。在你的系统上 EscapeDataString 之后 str 有什么值? 字符串保持不变。它不会改变 Uri.EscapeDataString changed with .NET 4.5 包含 RFC 3986 字符的行为。 @Dirk:感谢您提供的信息。事实上,我的目标是 .NET 4.5。【参考方案2】:根据RFC 1738:
Thus, only alphanumerics, the special characters "$-_.+!*'(),", and reserved characters used for their reserved purposes may be used unencoded within a URL.
HttpUtility.UrlEncode
和 WebUtility.UrlEncode
都不会对这些字符进行编码,因为标准规定括号 ()
可以不编码使用。
我不知道您链接的 URL Encoder / Decoder 为什么会对它们进行编码,因为它还将它们列为可在 URL 中使用的字符。
【讨论】:
我正在通过 HTTP 调用第三方 API 并在参数中传递一个字符串。此字符串是 UTF-8 URL 编码的。我的 API 客户端是用 asp.net C# 编写的,而 API 主机可能是用 Java 编写的。当我在字符串参数中有括号/括号 () 之类的字符时,UTF-8 编码器不会对它们进行编码,而 API 主机将它们编码为 %28 和 %29 并且我得到不正确的响应。有什么建议可以解决这个问题吗? API在文档中有如下参考docs.oracle.com/javase/1.5.0/docs/api/java/net/URLEncoder.html 你可以看看这个:***.com/questions/846487/…【参考方案3】:Uri.EscapeDataString
将使用不符合 RFC 1738 的 Uri 标准转换字符串。
RFC 1738 是旧的 URL 标准。
我通过使用FormUrlEncodedContent
完成了它:
data = new List<KeyValuePair<string, string>>();
data.Add(new KeyValuePair<string, string>("key", "value"));
var payloadBody = await new FormUrlEncodedContent(data).ReadAsStringAsync();
如果您不需要编码的 URL body,您可能需要使用键/值 f.e 来欺骗 arround。让值为空。
【讨论】:
以上是关于C# 对URL进行UTF-8编码 编码时为啥会把中文后面的第一个字母也转成了UTF-8呢?的主要内容,如果未能解决你的问题,请参考以下文章