如何在PHP中支持UTF8(日语,阿拉伯语,西班牙语......)URL

时间:2010-10-11 16:16:04

标签: php utf-8 internationalization

对于Web应用程序,我们需要链接到一些用户生成的内容。 用户输入标题,例如一个产品,我们为该产品生成一个SEO友好的URL:

像这样

title: a nice product

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

title: أبجد هوز

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

问题是不支持那些外语网址,浏览器拒绝打开这些链接。我已经看到wordpress设置支持这种网址,所以我想这是可能的。

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

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

4 个答案:

答案 0 :(得分:6)

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

  

内部以不同字符编码形式提供标识符的系统(如EBCDIC)通常会将文本标识符的字符转换为UTF-8 [STD63](或美国的其他一些超集)。内部接口上的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中表示的字符。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

你应该对阿拉伯语或unicode文本进行urlencode

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

将charset代码添加到页面的head标签非常重要,否则链接将无法正常工作

<meta charset="utf-8">