Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET MVC中对参数中的非UTF-8文本进行编码 背景_C#_.net_Asp.net Mvc_Encoding_Internationalization - Fatal编程技术网

C# 在ASP.NET MVC中对参数中的非UTF-8文本进行编码 背景

C# 在ASP.NET MVC中对参数中的非UTF-8文本进行编码 背景,c#,.net,asp.net-mvc,encoding,internationalization,C#,.net,Asp.net Mvc,Encoding,Internationalization,我有一个使用ISO-8859-1编码的web应用程序。当我使用Html.ActionLink()传递参数时,该值被解码为UTF-8: Web.config: <globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1" fileEncoding="iso-8859-1" /> 生成以下内容: This is a <a href="/Intranet/Read?n

我有一个使用
ISO-8859-1
编码的web应用程序。当我使用
Html.ActionLink()
传递参数时,该值被解码为
UTF-8

Web.config

<globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1"
               fileEncoding="iso-8859-1" />
生成以下内容:

This is a <a href="/Intranet/Read?name=Cosm%C3%A9ticos">test</a>
问题:
为什么字符串未解码为
Cosméticos

您的aspx文件是否实际保存在iso-8859-1中

“文件/将Xyz另存为”,然后单击“保存”按钮右侧的,可以使用更多编码选项来保存文件


猜测我发现了问题和解决方法:我收到的值是UTF-8,但如果我尝试使用System.Text.Encoding.UTF8.GetBytes(名称),它会将字符“Ô)转换为UTF-8值,而不是“Ô

解决方法是将字符串复制到字节[],然后使用System.Text.Encoding.Convert()


我不知道这是不是最好的办法,但现在一切都在为我工作。

< P> >一些你可能要考虑的事情。

public static string ActionLinkNoEncode(this HtmlHelper htmlHelper, string linkText, ActionResult action )
{
    var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);   
    var url = Uri.UnescapeDataString(urlHelper.Action(action)).ToLowerInvariant();  
    var linkTagBuilder = new TagBuilder("a");   
    linkTagBuilder.MergeAttribute("href", url);
    linkTagBuilder.InnerHtml = linkText;
    return linkTagBuilder.ToString();
}
首先,如果你还没有读过——我强烈建议你阅读乔尔·斯波尔斯基的文章,它为学习字符编码和编程奠定了基础

第二,从这个角度看,似乎有办法(意外地?)覆盖指定的编码方案。从文档中:

请求编码

指定每个传入请求的假定编码,包括 已发布的数据和查询字符串。如果请求附带请求 包含接受字符集属性的头,它覆盖 配置中的请求编码。默认编码是UTF-8, 在Machine.config中包含的
标记中指定 安装.NET Framework时创建的文件。如果请求编码 未在Machine.config或Web.config文件中指定,编码 默认为计算机的区域选项区域设置。在里面 单服务器应用程序,请求编码响应编码 应该是一样的。对于不太常见的情况(多服务器) 默认服务器编码不同的应用程序) 可以使用本地Web.config更改请求和响应编码 档案


您是否尝试过使用类似于的方法查看Accept Charset属性设置为什么?

谢谢,George-这更好。是的,我的文件保存在iso-8859-1中。但我不认为这是问题所在,因为“Cosméticos”来自我的数据库。编码的问题是,应用程序的每一层都必须严格相同,或者如果两层之间不匹配,则必须从一层转换到另一层。您的数据库是否符合iso-8859-1标准?可能是的,但可能值在放入之前是在UTF-8中!?当输出到aspx页面时,尝试转换iso-8859-1中的DB值,以查看是否有帮助。。你必须找到编码中断的步骤,它可能在MVC动作参数之前的其他地方。另外,我运行一个法语/英语网站,所以我有很多拉丁字符。无论如何,我更喜欢使用UTF-8来覆盖更广泛的字符范围。我的db是iso-8859-1格式。但正如您在我的Index.aspx文件中所看到的,字符串是正确的url编码的,因此如果我的文件或db保存在iso-8859-1中,则不再重要。问题似乎在于框架何时对其进行解码。
public ActionResult Read(string name) {
  //name is "Cosméticos" here!
}
public static string ActionLinkNoEncode(this HtmlHelper htmlHelper, string linkText, ActionResult action )
{
    var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);   
    var url = Uri.UnescapeDataString(urlHelper.Action(action)).ToLowerInvariant();  
    var linkTagBuilder = new TagBuilder("a");   
    linkTagBuilder.MergeAttribute("href", url);
    linkTagBuilder.InnerHtml = linkText;
    return linkTagBuilder.ToString();
}