我正在编写一个需要友好网址的网络应用程序,但我不知道如何处理非7位ASCII字符。我也不想用URL编码实体替换重音字符。是否有允许这种转换的C#方法,或者我是否需要实际绘制出我想要处理的每个案例?
答案 0 :(得分:3)
我不知道如何在C#中做到这一点,但你想要的神奇词是“Unicode分解”。有一种标准的方法来分解像“é”这样的组合字符,然后你应该能够过滤掉非ASCII字符。
编辑:this可能就是您要找的。 p>
答案 1 :(得分:2)
使用UTF-8:
非ASCII 首先必须根据UTF-8 [STD63]对字符进行编码 相应的UTF-8序列的每个八位字节必须是百分比 - 编码为URI字符。 - RFC 3986
答案 2 :(得分:1)
有类似的内容:URL Routing: Handling Spaces and Illegal Characters When Creating Friendly URLs
尽管如此,我不建议自动转换。在进行这些类型的更改时,某些单词可能会改变含义。你可以把一个好词变成一个不恰当的词。
答案 3 :(得分:1)
此链接可能有所帮助:http://www.codeproject.com/KB/cs/UnicodeNormalization.aspx
private string LatinToAscii(string InString)
{
string newString = string.Empty, charString;
char ch;
int charsCopied;
for (int i = 0; i < InString.Length; i++)
{
charString = InString.Substring(i, 1);
charString = charString.Normalize(NormalizationForm.FormKD);
// If the character doesn't decompose, leave it as-is
if (charString.Length == 1)
newString += charString;
else
{
charsCopied = 0;
for (int j = 0; j < charString.Length; j++)
{
ch = charString[j];
// If the char is 7-bit ASCII, add
if (ch < 128)
{
newString += ch;
charsCopied++;
}
}
/* If we've decomposed non-ASCII, give it back
* in its entirety, since we only mean to decompose
* Latin chars.
*/
if (charsCopied == 0)
newString += InString.Substring(i, 1);
}
}
return newString;
}
答案 4 :(得分:1)
好的 - 这里有一些好的答案。那些方法会起作用。但是,我必须质疑你的基本前提。我假设您正在讨论的这些值基本上是查询字符串参数,是吗?这是必须过滤掉特殊字符的最常见原因。
两三年来,我使用字符串编码/解码方法通过查询字符串传递这样的东西。总是存在间歇性的问题,因为 - 对它来说 - 有很多不同的可能的特殊字符,一个浏览器与另一个浏览器的问题等等。我们的方法并不像这里概述的那样复杂,但仍然如此。在2005年,在重写我正在研究的大部分系统时,我们决定只通过查询字符串传递id值。这种方法效果非常好,我想不出任何弊端。如果你有一个数据库后端,你已经有一个id附加到几乎每个字符串,无论如何。如果这是用于搜索等,您可以随时通过表单发送 - 或者您可以使用不需要您首先加载其他页面的AJAX解决方案。
这些方法对于每种情况都不是最好的 - 这里没有任何灵丹妙药 - 但这种方法对我和我的团队来说简单而且非常实用,所以我认为至少你可以考虑一下。
答案 5 :(得分:0)
答案 6 :(得分:0)
(在浏览器中复制/粘贴,它有效吗?)