【问题标题】:URL and Title with Foreign Characters带有外来字符的 URL 和标题
【发布时间】: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 不,它将特殊字符更改为: ü诸如此类...

标签: c# mysql asp.net database slug


【解决方案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表中的额外字段。
  • 是的,我也在考虑这个,但不知道有没有其他更好的选择
猜你喜欢
  • 2013-04-06
  • 2020-06-11
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
相关资源
最近更新 更多