转换UTF8文本以在URL中使用

时间:2010-03-10 17:31:02

标签: php url internationalization

我正在开发一个使用UTF8显示非英文字符的国际网站。我也使用包含项目名称的友好URL。显然我不能在URL中使用非英文字符。

这种转换是否存在某种常见做法?我不确定我应该用哪些英文字符替换它们。有些是非常明显的(比如è到e),但是我不熟悉的其他角色(例如ß)。

5 个答案:

答案 0 :(得分:6)

您可以在URL路径中使用UTF-8编码数据。您只需要使用Percent encoding对其进行编码(请参阅rawurlencode):

// ß (U+00DF) = 0xC39F (UTF-8)
$str = "\xC3\x9F";
echo '<a href="http://en.wikipedia.org/wiki/'.rawurlencode($str).'">'.$str.'</a>';

这将回显http://en.wikipedia.org/wiki/ß的链接。现代浏览器将在位置栏中显示字符ß,而不是UTF-8(%C3%9F)中该字符的百分比编码表示。

如果您不想使用UTF-8但只想使用ASCII字符,我建议使用像ÁlvaroG。Vicario建议的音译。

答案 1 :(得分:5)

我通常使用iconv()和'ASCII // TRANSLIT'选项。这需要输入:

último año

并生成如下输出:

'ultimo a~no

然后我用preg_replace()用短划线替换空格:

'ultimo-a~no

...并删除不需要的字符,例如

[^a-z0-9-]

它可能与阿拉伯语或中文没用,但它适用于西班牙语,法语或德语。

答案 2 :(得分:3)

  

显然我不能在URL中使用非英文字符。

事实上,你可以。维基百科软件(内置于PHP)支持这一点,例如en.wikipedia.org/wiki/☃

请注意,您需要对URL进行适当编码,如其他答案中所示。

答案 3 :(得分:2)

使用rawurlencode对您的网址名称进行编码,并使用rawurldecode将网址中的名称转换回原始字符串。这两个函数根据RFC 1738将URL转换为URL或从URL转换。

答案 4 :(得分:-1)

上次我尝试过(大约一周前),UTF-8(特别是日语)字符在URL中运行良好,没有任何额外的编码。甚至在我测试的所有浏览器(Safari,Chrome和Firefox,都在Mac上)的地址栏中看起来都是正确的,我不知道我的女朋友在Windows上使用了什么浏览器。除了大多数Windows安装,我只是为日文字符显示正方形,因为它们缺少显示它们所需的字体,它似乎在那里工作正常。

我尝试的网址是:http://www.webghoul.de.private-void.net/cache/black-f-with-あい-50.png(WMD似乎不喜欢它)

Proof by screenshot http://heavymetal.theredhead.nl/~kris/stackoverflow/screenshot-utf8-url.png

因此规范可能实际上不允许这样做,因为我已经看到它的全面运作,除了可能在那些喜欢规范的编辑器中; - )

我实际上不建议在URL中使用这些类型的字符,但我也不会将其作为“修复”的首要任务。