我正在开发一个website,让人们可以创建自己的翻译器。他们可以选择URL的名称,然后将其发送到数据库,然后使用.htaccess重定向website.com/nameoftheirtranslator
为:
website.com/translator.php?name=nameoftheirtranslator
这是我的问题:
最近,我注意到有人在名称中创建了一个包含特殊字符的翻译器 - > “LAEFÊVËŠI”。
但是当它被处理(发布到php文件,然后mysqli_real_escape_string
)并添加到数据库时,它显示为“LAEFVI” - 所以你可以看到特殊字符在某处丢失了。
我不太清楚该怎么做,但我认为有两条路径:
我想知道是否有可能有像website.com/LAEFÊVËŠI
这样的网址 - 可以由服务器解释吗?
EDIT1:我注意到,在这个问题上,堆栈溢出会将标题中的特殊字符转换为.../using-special-characters-in-urls
!这似乎是一个很好的解决方案,我想我可以创建一个函数,将特殊字符转换为正常的等价物(如â)?我想我会忽略像/#@"',&
这样的其他角色?现在我想到了,必须有一些相当标准/良好实践的策略来解决这样的问题。
EDIT2: 实际上,现在我想起来了(更多) - 我真的希望这个东西可以被任何语言的人使用(不仅仅是英语),所以我真的很想能够在网址中加入特殊字符。话虽如此,我刚发现Google没有将â
解释为a
,因此如果我不翻译字母,人们可能很难找到LAEFÊVËŠI
翻译正常人物。稀释!
答案 0 :(得分:1)
好的,在那个疯狂的插曲之后,发生了什么:
preg_replace()
删除了所有非字母数字字符。preg_replace
,因此仅删除空格并使用rawurlencode()
: $name = mysqli_real_escape_string($con, rawurlencode( preg_replace("/\s/", '', $name) ));
RewriteRule ^([^/.]+)$ process.php?name=$1 [B]
process.php
没有rawurlencode()
阅读name
$name = rawurlencode($_GET['name']);
现在可行。
睡眠时间。