带有外来字符的 URL 和标题

Posted

技术标签:

【中文标题】带有外来字符的 URL 和标题【英文标题】:URL and Title with Foreign Characters 【发布时间】:2014-01-13 15:19:18 【问题描述】:

有人可以在我的 ASPX 网页上添加文章。

例如,他们输入类似这样的标题:

Öçöçü

这在数据库中保存为:

Öçöçü

但是当我需要从数据库中读取它并为其创建一个 url 时,我会以这种格式读取它:

Ococu

所以我派人阅读这篇文章到这个网址:www.test.com/ococuOcocu 是查询字符串。

我需要检索标题为Öçöçü的这篇文章的内容,但我不能这样做

SELECT * FROM Article WHERE Title = Ococu(Ococu = 查询字符串),因为它已作为Öçöçü保存到数据库中

我能做些什么来解决这个问题?我需要执行该查询,但这是不可能的,因为查询字符串不包含保存在数据库中的外来字符。

或者我应该在数据库中创建两个属性?一个用于Title,另一个用于URL?所以我可以在 where 子句中执行查询:WHERE URL = Ococu

我需要你们的帮助。

【问题讨论】:

你使用什么数据库?您插入数据库的变量类型是什么? mysql,我只是向数据库发送一个String,例如:土耳其语。 您的数据库中的字符集是否设置为相关的(土耳其语)? @Ghost93 不,它将特殊字符更改为: ü诸如此类... 试试这个答案:***.com/questions/10444004/mysql-turkish-character 【参考方案1】:

如果不知道列在 MySQL 表中的声明方式以及实体(字符)的存储方式,很难判断如何解决此问题。如果您的列声明如下:

  Title VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_turkish_ci

这允许表格包含您的土耳其语字符(以及希腊语和匈牙利语,就此而言),而不必进行实体编码(ü 等)

如果实际上您的表是这样编码的,请尝试以下 SELECT 语句:

 SELECT * 
   FROM Article
  WHERE Title = 'ococu' 
COLLATE utf8_general_ci

由于对土耳其语一无所知,我不知道这是什么原因,但很明显,土耳其语排序规则将 ö 视为与 o 不同的字母,同样适用于 çc 和 @ 987654329@ 和u。但是,utf_general_ci 排序规则将这些字母视为相同。这就是上面的SELECT 语句有效的原因。

如果您在表中的数据以实体编码(ü 等)存储,您确实应该将其转换为 utf8,以便您可以使用这种搜索。

最后,您提到的带有 ococu 值的 URL 片段在交易中通常被称为 slug。您的标题Öçöçü 需要转换为 slug 值以进行搜索。我上面的建议使用排序规则来做到这一点。值得一提的是,内容管理系统通常将文章的标题和 slug 存储在数据库表的单独列中。这允许在创建文章时明确地从标题创建 slug。

这是一个 Stack Overflow 项目,解释如何使用 C# 将 unicode 短语转换为 slug。

URL Slugify algorithm in C#?

【讨论】:

感谢您的回答!现在我创建了 2 列,一个用于带有外来字符的标题,另一个用于 slug(用作 URL),这也是一个好的解决方案吗(就像你提到的那样)? 是的,两列方法将是高质量的并且可以轻松扩展。【参考方案2】:

最好在数据库中有 2 个单独的字段,一个用于标题,另一个用于 url。有时您希望更改标题,但 url 保持不变,这样现有的链接就不会被破坏。而且您可能不希望在您的网址中包含空格和其他特殊字符,因此您希望缩短和替换符号(就像您在问题中描述的那样)。

如果第三方在您的网站上创建文章,例如从 url 参数执行讨厌的脚本,这也可以减轻一些可能暴露的安全风险。

【讨论】:

网络程序员应该如何解决这个问题?他们是否还应该创建 2 个单独的字段? 我会说应该从标题自动生成 url 句柄 - 用- 替换空格,删除特殊字符并剪切长字符串。这不是用户输入的,所以输入表单上没有额外的字段,而是DB表中的额外字段。 是的,我也在考虑这个,但不知道有没有其他更好的选择

以上是关于带有外来字符的 URL 和标题的主要内容,如果未能解决你的问题,请参考以下文章

删除带有特殊字符的单词

MS Word Ole 自动化、ADO 和外来字符

文件读取外来字符

为啥有外来字符时不能正确填充空格字符?

Windows 中锯齿状的谷歌字体和粗体的外来字符

如何使用 xsl:sort 与外来字符(即“æ”、“ø”和“å”)