2010-10-11 188 views
2

对于Web应用程序,我们需要链接到一些用户生成的内容。 A用户输入标题,例如我们生成SEO友好的URL该产品的产品:如何在PHP中支持UTF8(日文,阿拉伯文,西班牙文,...)URL

这样

title: a nice product 

www.user.com/product/a-nice-product 

title: أبجد هوز 

www.user.com/product/أبجد هوز 

的问题是,这些外国语言的网址的不支持和浏览器拒绝打开这些链接。我见过WordPress的设置支持这种类型的网址,所以我想这是可以做到的。

有谁知道我们应该如何支持这个在PHP?

维基百科处理这个问题就好了:http://ar.wikipedia.org

+0

Depends中关于你的意思是“很好”。在我的IE8中,最后一个'/'后的URL显示为%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%D8%A7%D9%84%D8%B1 %D8%A6%D9%8A%D8%B3%D9%8A%D8%A9。 – 2010-10-12 16:43:36

回答

6

虽然URL本身只允许US-ASCII字符,你可以use Unicode characters in the URI path,如果你对其进行编码使用UTF-8,然后通过使用percent-encoding将它们转换在US-ASCII字符:

一个系统,内部提供以不同字符编码形式的标识符(例如EBCDIC)通常将在内部接口处执行文本标识符到UTF-8 [或US-ASCII字符编码的一些其他超集]的字符转换,从而提供比仅仅对原始八位字节进行百分比编码所得到的标识符更有意义的标识符。

所以,你可以做这样的事情(假设UTF-8):

$title = 'أبجد هوز'; 
$path = '/product/'.rawurlencode($title); 
echo $path; // "/product/%D8%A3%D8%A8%D8%AC%D8%AF%20%D9%87%D9%88%D8%B2" 

虽然URI路径实际上与百分号编码的编码,最现代的浏览器将显示此序列代表的字符在使用UTF-8时,在Unicode中。

+0

,但是对于例如/ product /españa使这个/ product/espana代替/ product/espa%F1a? – Jorre 2010-10-12 16:42:48

+0

好东西队友,谢谢你的帮助! – Jorre 2010-10-12 17:24:24

+0

我确定您检查了这些网址的复制粘贴能力和书签功能。根据我的经验,当您将它们作为锚点标记或重定向网址提供给浏览器时,它们通常会正常工作,但一旦浏览器必须自行存储和检索URL,所有投注都将关闭。希望你找到解决方案,祝你好运! – BjornS 2010-10-12 19:05:05

0

您可能需要使用IDNA编码的URL的非ASCII部分。

http://en.wikipedia.org/wiki/Internationalized_domain_name

+1

IDNA仅适用于实际的域名。 URL的其余部分使用百分比编码(PHP中的'urlencode()')进行编码。 – TRiG 2010-10-11 16:39:02

+0

我们可以使用urlencode()来编码所有非ascii字符吗? – Jorre 2010-10-11 21:10:13

1

你有麻烦了,我害怕。 URL的编码由浏览器决定。在尝试支持使用挪威特殊字符的网址时,我遇到了同样的问题,而且这种情况根本不可能。

您可以将浏览器重定向到UTF-8 URL,但它可能会在ISO中回复您。在某些情况下,浏览器(例如firefox)会在同一个URL中混合使用ISO和UTF-8格式(这在发生get参数时尤其会发生)。

我的建议很简单;不要这样做,使用英语(更好的SEO!)或拼写它的发音。

+0

对我来说这不是问题,但我的网络应用程序的客户是国际化的,并将使用他们自己的语言标题。 – Jorre 2010-10-11 21:04:46

+0

查看http://ar.wikipedia.org,他们正在处理这个很好,所以我必须有可能? – Jorre 2010-10-12 16:40:09

+0

@Jorre他们以同样丑陋的urlencoded方式拥有它。它的浏览器使它看起来不错。更好地音译它 – 2010-10-12 17:24:28

0

你应该做进行urlencode阿拉伯语或Unicode文本

urlencode('كلام-عربي') 

而且其非常重要的字符集代码添加到页面的头部标记,否则该链接将无法正常工作

<meta charset="utf-8">