我正在尝试从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'));
答案 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编码的网址