使字符串 URL 友好(例如:将蒙特利尔转换为蒙特利尔)
Posted
技术标签:
【中文标题】使字符串 URL 友好(例如:将蒙特利尔转换为蒙特利尔)【英文标题】:Making strings URL Friendly (eg: convert Montréal to Montreal) 【发布时间】:2010-10-11 08:08:42 【问题描述】:我正在编写一个需要友好 url 的 Web 应用程序,但我不确定如何处理非 7 位 ASCII 字符。我也不想用 URL 编码的实体替换重音字符。是否有允许这种转换的 C# 方法,或者我是否需要实际映射出我想要处理的每一个案例?
【问题讨论】:
我从这个问题的 URL 中看到,这是 *** 设计者没有理会的事情 :) 大声笑帕特里克,确实,我们可以看到这并没有阻止他们:) 【参考方案1】:我不知道如何在 C# 中做到这一点,但是您想要的魔术词是“Unicode 分解”。有一种标准方法可以分解“é”等组合字符,然后您应该能够过滤掉非 ASCII 字符。
编辑:this 可能就是您要查找的内容。
【讨论】:
【参考方案2】:使用 UTF-8:
非 ASCII 字符必须首先根据 UTF-8 [STD63] 编码,然后 对应的 UTF-8 序列的每个八位字节必须是百分比- 编码以表示为 URI 字符。 — RFC 3986
【讨论】:
+1。在路径部分中包含非 ASCII 字符是完全允许的;您对它们的 UTF-8 字节进行十六进制编码,浏览器会在地址栏中显示 Unicode 版本。请参阅 Wikipedia 以了解效果很好的地方。 即使他的第二句话是“我不想用 URL 编码的实体替换重音字符”,但您告诉他做一些“必须进行百分比编码才能表示为 URI”的事情?我们这里的问题是无法沟通。 我认为他假设这样的后缀词显示为%xx
,而不是它所代表的字符。但这只是单词不是 UTF-8 编码的情况。
你没有有进行十六进制编码;您可以使用“IRI”(带有纯未转义 Unicode 字符的 URI),它将在浏览器中与相同的 URI 一样工作;只是逃避在历史上更可靠。 “URL 编码实体”应该是什么意思是有争议的。可见 %-转义? html 实体引用?【参考方案3】:
有类似的东西:URL Routing: Handling Spaces and Illegal Characters When Creating Friendly URLs
不过,我不推荐自动转换。在进行此类更改时,某些单词可能会改变含义。你可以把一个好词变成一个不恰当的词。
【讨论】:
感谢您的链接。我在搜索中找不到任何内容。【参考方案4】:好的——这里有一些很好的答案。这些方法会奏效。但是,我不得不质疑你的基本前提。我假设您正在讨论的这些值基本上是查询字符串参数,是吗?这是必须过滤掉特殊字符的最常见原因。
两三年来,我使用字符串编码/解码方法通过查询字符串传递这样的内容。总是有间歇性的问题,因为——该死——有很多不同的可能的特殊字符,以及一个浏览器与另一个浏览器中的问题,等等。我们的方法没有这里概述的那么复杂,但仍然如此。 2005 年,在对我正在开发的大部分系统进行重写期间,我们决定改为只通过查询字符串传递 id 值。这种方法效果非常好,我想不出它有什么缺点。如果你有一个数据库后端,无论如何,你已经为几乎每个字符串附加了一个 id。如果这是用于搜索等,您始终可以通过表单发布来发送它——或者您可以使用不需要您首先加载另一个页面的 AJAX 解决方案。
这些方法并不是在所有情况下都是最好的——这里没有什么灵丹妙药——但这种方法对我和我的团队来说很简单而且非常实用,所以我认为这是你至少要考虑的事情。
【讨论】:
它们不会是查询字符串变量。我将制作以下形式的 URL:http:/server/name/of-montreal,并且我希望通过值“Of Montréal”自动生成 url slug“of-montreal”。在翻译不佳的情况下,总会有手动覆盖。 那么您肯定会接受其他人的建议。听起来您可以只生成一次,然后将它们存储在数据库中,这更好——必须实时编码/解码效率较低。【参考方案5】:嗯,我认为原因很简单, 这些字符并不多,你可以很容易地使用字符串类的 Replace() 方法替换字符串中的字符。
【讨论】:
【参考方案6】:此链接可能会有所帮助: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;
【讨论】:
【参考方案7】:http://Montréal.com
(在浏览器中复制/粘贴,可以吗?)
【讨论】:
域名中的Unicode字符与路径/查询部分的工作方式不同,它们使用IDN的“punycode”规则进行编码。以上是关于使字符串 URL 友好(例如:将蒙特利尔转换为蒙特利尔)的主要内容,如果未能解决你的问题,请参考以下文章
sh 蒙特利尔树木数据的数据转换/清理数据:http://donnees.ville.montreal.qc.ca/dataset/arbres
飞行器基于matlab蒙特卡洛和控制算法四旋翼无人机路径规划含Matlab源码 1988期