带有外来字符的 URL 和标题
Posted
技术标签:
【中文标题】带有外来字符的 URL 和标题【英文标题】:URL and Title with Foreign Characters 【发布时间】:2014-01-13 15:19:18 【问题描述】:有人可以在我的 ASPX 网页上添加文章。
例如,他们输入类似这样的标题:
Öçöçü
这在数据库中保存为:
Öçöçü
但是当我需要从数据库中读取它并为其创建一个 url 时,我会以这种格式读取它:
Ococu
所以我派人阅读这篇文章到这个网址:www.test.com/ococu
,Ococu
是查询字符串。
我需要检索标题为Öçöçü
的这篇文章的内容,但我不能这样做
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 和标题的主要内容,如果未能解决你的问题,请参考以下文章