在URL中使用spéciâl字符

时间:2013-06-27 14:34:19

标签: mysql url urlencode

我正在开发一个website,让人们可以创建自己的翻译器。他们可以选择URL的名称,然后将其发送到数据库,然后使用.htaccess重定向website.com/nameoftheirtranslator

为:

website.com/translator.php?name=nameoftheirtranslator

这是我的问题:

最近,我注意到有人在名称中创建了一个包含特殊字符的翻译器 - > “LAEFÊVËŠI”。

但是当它被处理(发布到php文件,然后mysqli_real_escape_string)并添加到数据库时,它显示为“LAEFVI” - 所以你可以看到特殊字符在某处丢失了。

我不太清楚该怎么做,但我认为有两条路径:

  1. 尝试保留字符并进行一些编码(不知道从哪里开始)
  2. 抛弃它们并告诉用户只能在翻译人员的姓名中使用“普通”字符(不理想)
  3. 我想知道是否有可能有像website.com/LAEFÊVËŠI这样的网址 - 可以由服务器解释吗?

    EDIT1:我注意到,在这个问题上,堆栈溢出会将标题中的特殊字符转换为.../using-special-characters-in-urls!这似乎是一个很好的解决方案,我想我可以创建一个函数,将特殊字符转换为正常的等价物(如â)?我想我会忽略像/#@"',&这样的其他角色?现在我想到了,必须有一些相当标准/良好实践的策略来解决这样的问题。

    EDIT2: 实际上,现在我想起来了(更多) - 我真的希望这个东西可以被任何语言的人使用(不仅仅是英语),所以我真的很想能够在网址中加入特殊字符。话虽如此,我刚发现Google没有将â解释为a,因此如果我不翻译字母,人们可能很难找到LAEFÊVËŠI翻译正常人物。稀释!

1 个答案:

答案 0 :(得分:1)

好的,在那个疯狂的插曲之后,发生了什么:

  • 发现我使用PHP preg_replace()删除了所有非字母数字字符。
  • 已更改preg_replace,因此仅删除空格并使用rawurlencode()

$name = mysqli_real_escape_string($con, rawurlencode( preg_replace("/\s/", '', $name) ));

  • 现在一切都在数据库编码,安全和健全。
  • 使用此重写规则RewriteRule ^([^/.]+)$ process.php?name=$1 [B]
  • 绕圈跑了2个小时,我的重写错了,因为我得到了“找不到页面”
  • 意识到process.php没有rawurlencode()阅读name

$name = rawurlencode($_GET['name']);

现在可行。

WOO!

睡眠时间。