如何通过 api 检索带有重音符号的 url 的 linkedin 配置文件?
How to retrieve linkedin profiles via api for accented urls?
我正在尝试从 LinkedIn API 获取信息,但是当 url 有任何类型的重音字符时,我 运行 遇到了一些问题。
对于非重音 urls,对 API 的调用工作正常,我可以毫无问题地检索数据,但是当我尝试使用重音 urls 时,我收到错误消息。
我试过转义 url 但它不起作用:
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'));
更新
我很确定问题在于您的程序顶部没有 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 服务器变得混乱
URLs 仅使用八位八位字节,并且没有假定的 Unicode 字符编码
RFC 3986 是统一资源标识符 (URI) 的当前标准,第 2 节 - 字符 - 解释了 URL 中唯一允许的字符是特殊分隔符 !
、#
、$
、&
、'
、(
、)
、*
、+
, ,
, /
, :
, ;
, =
, ?
, @
, [
, ]
除了可用于构建与正则表达式模式匹配的标识符的未保留字符 [0-9A-Za-z._~-]
您可以通过使用百分号 %
后跟两个十六进制数字来表示任何没有特殊含义的八位字节来扩展此限制,但这不包括多字节字符,并且没有暗示如果它们在 URL.
中使用,则编码
如果您使用 URI::Escape
,那么 uri_escape_utf8
将正确地将 UTF-8 中的任何字符串编码为未保留字符和百分号编码字符的组合,但服务器必须期待 utf-8 -编码 URL
最有可能的问题是
您的原始字符串已经编码并且包含编码字节而不是字符,因此 uri_escape_utf8
正在对编码字符串进行编码
LinkedIn API 不期望 UTF-8 编码 URLs
我正在尝试从 LinkedIn API 获取信息,但是当 url 有任何类型的重音字符时,我 运行 遇到了一些问题。
对于非重音 urls,对 API 的调用工作正常,我可以毫无问题地检索数据,但是当我尝试使用重音 urls 时,我收到错误消息。
我试过转义 url 但它不起作用:
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'));
更新
我很确定问题在于您的程序顶部没有 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 服务器变得混乱
URLs 仅使用八位八位字节,并且没有假定的 Unicode 字符编码
RFC 3986 是统一资源标识符 (URI) 的当前标准,第 2 节 - 字符 - 解释了 URL 中唯一允许的字符是特殊分隔符 !
、#
、$
、&
、'
、(
、)
、*
、+
, ,
, /
, :
, ;
, =
, ?
, @
, [
, ]
除了可用于构建与正则表达式模式匹配的标识符的未保留字符 [0-9A-Za-z._~-]
您可以通过使用百分号 %
后跟两个十六进制数字来表示任何没有特殊含义的八位字节来扩展此限制,但这不包括多字节字符,并且没有暗示如果它们在 URL.
如果您使用 URI::Escape
,那么 uri_escape_utf8
将正确地将 UTF-8 中的任何字符串编码为未保留字符和百分号编码字符的组合,但服务器必须期待 utf-8 -编码 URL
最有可能的问题是
您的原始字符串已经编码并且包含编码字节而不是字符,因此
uri_escape_utf8
正在对编码字符串进行编码LinkedIn API 不期望 UTF-8 编码 URLs