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

标签 perl uri url-encoding diacritics

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

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

  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
    

最佳答案

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

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

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

既不属于保留类别也不属于非保留类别的八位字符必须始终采用百分比编码

##非保留字符

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

This link doesn't work properly since the characters are mangled

这是客户端和服务器之间的问题。您似乎正在发送 ISO-8859-1 字符,其中方案 E1E2 对应于 e eager e 抑扬符。但是,如果您的服务器需要 UTF-8 编码,那么它们应该显示为字节序列 C3 A1C3 A2

我无法判断您的服务器期望什么编码,但它显然不是您要发送的编码。 current standard是将非 ASCII 字符编码为 UTF-8 并对结果字节进行百分比编码



###更新

最好的解决方案是使用 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

关于perl - 用变音符号(带重音的字母)表示 URI 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39427982/

相关文章:

python - 提取两个子字符串之间匹配的字符串部分

perl - $my_array 何时不同于\@my_array?

java - 切断相对于另一个的 URI

java - 包含路径的 URI 模板变量?

ruby - 将带空格的字符串转换为 URL

http - 解码 URL 中的变音符号(或复合编码与预组合编码)

perl - 检测 URL 的模块是什么?

arrays - Perl:如何在新哈希中声明空数组引用?

java - 使用 URI 显示图像在 Android Q 上不起作用

Python:防止 URL 在 Django View 中编码