使用变音符号(带重音的字母)表示URI的正确方法是什么?

时间:2016-09-10 16:06:36

标签: perl uri url-encoding diacritics

在URI中使用变音符号的正确和官方方法是什么?

我有以下三种不同的方式:

  1. 此处á = %E1â = %E2,空格= %20,逗号= %2C,但此链接由于字符被破坏,因此无法正常工作:

    http://www.recordspreservation.org/cgi-bin/list_directory_1.cgi?directory=%2CBrasil%2CGoi%E1s%2CLuzi%E2nia%2CSanta%20Luzia%2CBatismos%201749-1753%2CImagens&image_name=_MG_5229.JPG
    
  2. 此处空格= %20,逗号= %2C,我不会对a做任何事情。此链接有效:

    http://www.recordspreservation.org/cgi-bin/list_directory_1.cgi?directory=%2CBrasil%2CGoiás%2CLuziânia%2CSanta%20Luzia%2CBatismos%201749-1753%2CImagens&image_name=_MG_5229.JPG
    
  3. 此处空格= +,逗号= %2C,我不会对a做任何事情。此链接有效:

    http://www.recordspreservation.org/cgi-bin/list_directory_1.cgi?directory=%2CBrasil%2CGoiás%2CLuziânia%2CSanta+Luzia%2CBatismos+1749-1753%2CImagens&image_name=_MG_5229.JPG
    

1 个答案:

答案 0 :(得分:3)

URL字符串中的字符必须位于7位ASCII的受限子集中,并且不为宽字符指定编码

其中一些是 无保留 ,并且可以在语法允许的任何地方使用

其余字符为 保留 ,因为它们构成了网址语法的一部分;如果保留字符在语法含义之外使用,则必须进行百分比编码

保留非保留类别中的八位字符必须始终为百分比编码

未保留的字符

0 to 9
A to Z
a to z
-
.
_
~

保留字符

! - %21
# - %23
$ - %24
& - %26
' - %27
( - %28
) - %29
* - %2A
+ - %2B
, - %2C
/ - %2F
: - %3A
; - %3B
= - %3D
? - %3F
@ - %40
[ - %5B
] - %5D
  

由于字符被损坏,此链接无法正常工作

这是客户端和服务器之间的问题。看起来您正在发送ISO-8859-1字符,其中方案E1E2对应 e acute ,而 e circumflex 。但是,如果您的服务器期望UTF-8编码,则这些编码应显示为字节序列C3 A1C3 A2

我无法分辨您的服务器预期的编码,但显然不是您要发送的内容。 current standard用于对UTF-8中的非ASCII字符进行编码,并对结果字节进行百分比编码


更新

最佳解决方案是使用URI模块,该模块将根据需要对字符串进行编码

请特别注意,如果您需要在源代码中使用UTF-8编码的字符,如下所示,那么您必须在程序的顶部放置use utf8。您还需要确保编辑器正在将UTF-8数据写入程序文件。

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

use URI;

my $url = URI->new('http://www.recordspreservation.org/cgi-bin/list_directory_1.cgi?directory=,Brasil,Goiás,Luziânia,Santa Luzia,Batismos 1749-1753,Imagens&image_name=_MG_5229.JPG');

say $url;

输出

http://www.recordspreservation.org/cgi-bin/list_directory_1.cgi?directory=,Brasil,Goi%C3%A1s,Luzi%C3%A2nia,Santa%20Luzia,Batismos%201749-1753,Imagens&image_name=_MG_5229.JPG