如何通过api为重音网址检索linkedin个人资料?

时间:2016-05-10 14:08:29

标签: perl linkedin linkedin-api

我正在尝试从LinkedIn API获取信息,但是当网址有任何类型的重音字符时,我会遇到一些问题。

对于非重音的网址,对API的调用工作正常,我可以毫无问题地检索数据,但是当我尝试使用重音网址时,我会收到错误。

我已尝试转义网址,但不起作用:

uri_escape_utf8:

'https://api.linkedin.com/v1/people/url=' . uri_escape_utf8('xxxxx');

uri_escape:

'https://api.linkedin.com/v1/people/url=' . uri_escape('xxxxx');

没有逃脱:

'https://api.linkedin.com/v1/people/url=xxxxx';

双重逃脱:

uri_escape_utf8('https://api.linkedin.com/v1/people/url=' . uri_escape_utf8('xxxxx'));

1 个答案:

答案 0 :(得分:0)

更新

我非常确定问题是你的程序顶部没有use utf8。此代码正确编码i-diaresis为%C3%AF,e-acute为%C3%A9

use utf8;
use strict;
use warnings 'all';
use feature 'say';

use URI::Escape qw/ uri_escape_utf8 /;

say uri_escape_utf8('http://linkedin.com/in/anaïs-thévoz-b070838');

输出

http%3A%2F%2Flinkedin.com%2Fin%2Fana%C3%AFs-th%C3%A9voz-b070838

而没有use utf8,Perl会看到UTF-8编码的字节而不是字符,就像这样

"http://linkedin.com/in/ana\xC3\xAFs-th\xC3\xA9voz-b070838"

uri_escape_utf8"\xC3\xAF" %C3%83%C2%AF"\xC3\xA9"双重编码为​​%C3%83%C2%A9,如下所示

输出

http%3A%2F%2Flinkedin.com%2Fin%2Fana%C3%83%C2%AFs-th%C3%83%C2%A9voz-b070838

所以LinkedIn服务器感到困惑


URL仅使用8位八位字节,并且没有假定的Unicode字符编码

RFC 3986是统一资源标识符(URI)的当前标准,第2节 - 字符 - 解释了URL中允许的唯一字符是特殊分隔符!,{{1 }},#$&'()*+,/:;=?@[此外到可用于构建与正则表达式模式]

匹配的标识符的未保留字符

您可以使用百分号[0-9A-Za-z._~-]后跟两个十六进制数字来扩展此限制,以表示没有特殊含义的任何八位字节,但这并不涵盖多字节字符,并且没有隐含编码,如果它们在URL中使用。

如果您使用的是URI::Escape,那么%会将UTF-8中的任何字符串正确编码为未保留字符串和百分比编码字符的组合,但服务器必须期望utf-8编码URL

最可能的问题是

  • 您的原始字符串已经过编码且包含已编码的字节而非字符,因此uri_escape_utf8正在编码已编码的字符串

  • LinkedIn API并不期望UTF-8编码的网址