如何在URL中转义中文Unicode字符?

8
我有一款PHP网络应用程序,有中国用户会输入产品信息,例如产品标题和价格。
我们想要使用产品标题为其生成一个漂亮的URL链接。似乎我们不能直接使用中文作为HREF属性。
有没有人知道如何处理“婴儿服饰”这样的标题,以便我们可以生成干净的URL链接,比如http://www.site.com/婴儿服饰
对于“普通”的语言,一切都很正常,但高UTF-8语言会给我们带来问题。
此外,在生成干净的URL链接时,我们要考虑SEO,但我在这方面对中文没有经验。

什么是“高UTF8”语言?我不知道UTF-16标签是用来做什么的,但如果你不是在寻找一般性答案,你应该使用PHP标签。此外,你没有展示任何代码,所以无法确定问题出在哪里。 - tchrist
3个回答

6
这段代码使用了CPAN模块URI::Escape
#!/usr/bin/env perl

use v5.10;
use utf8;

use URI::Escape qw(uri_escape_utf8);

my $url  = "http://www.site.com/";
my $path = "婴儿服饰";

say $url, uri_escape_utf8($path);

运行时,输出:
http://www.site.com/%E5%A9%B4%E5%84%BF%E6%9C%8D%E9%A5%B0

您是在寻找这个吗?

顺便说一下,那四个字符是:

CJK UNIFIED IDEOGRAPH-5A74
CJK UNIFIED IDEOGRAPH-513F
CJK UNIFIED IDEOGRAPH-670D
CJK UNIFIED IDEOGRAPH-9970

根据Unicode::Unihan数据库,似乎是“英儿福氏”或者只是Lingua::ZH::Romanize::Pinyin的“ying er fu shi”。甚至可能使用Unicode::Unihan中广东话版本的“jing¹ jan⁴ fuk⁶ sik¹”或“jing˥ jan˨˩ fuk˨ sik˥”。请注意保留HTML标签。

6
如果你的字符串已经是UTF-8编码,只需要使用rawurlencode来正确地对字符串进行编码:
$path = '婴儿服饰';
$url = 'http://example.com/'.rawurlencode($path);

UTF-8是非ASCII字符的首选字符编码(尽管在URI中只允许ASCII字符,这就是为什么需要使用百分号编码)。结果与tchrist的示例相同:

http://example.com/%E5%A9%B4%E5%84%BF%E6%9C%8D%E9%A5%B0

1
将编码后的URL用作链接的href属性,并将原始字符保留为链接的内容。这样,您就可以拥有安全的URL并使网页对SEO友好。
// Safely convert url like "http://example.com/婴儿服饰" to valid encoded string
// => http://example.com/%E5%A9%B4%E5%84%BF%E6%9C%8D%E9%A5%B0
// KEY: multipart character occupies more than one byte
function autoEncodeMultibyteChars($url) {
    $encoding   = 'UTF-8';
    $mbLen      = mb_strlen($url, $encoding);
    $append     = '';
    for ($idx = 0; $idx < $mbLen; $idx++) {
        $char   = mb_substr($url, $idx, 1, $encoding);
        if (strlen($char) > 1) {    // multibyte char
            $append     .= rawurlencode($char);
        } else {
            $append     .= $char;
        }
    }
    return  $append;
}

1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接