百分比编码保留字符

Percent Encoding Reserved Characters

Wikipedia 列出了我试图用百分比编码替换字符串中的几个保留字符。字符是:

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

我的批处理脚本正在读取用户的输入,然后输出一个字符串,其中保留字符已替换为它们的百分比编码值。

问题是一些字符没有被读入,而其他字符在尝试对它们进行百分比编码时不起作用。

我的密码是

@echo off
setlocal EnableDelayedExpansion
set /p pass=Enter pass: 

@REM Do % first so it doesn't replace all the new %
set "pass=!pass:%%=%%25!"

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

echo %pass%
pause

我正在用 Test ! # $ % ' ( ) * + , / : ; = ? @ [ ] 进行测试。

文本中的 ! 似乎没有读入字符串,我不得不注释掉三个字符转换,因为它们不起作用。

我怎样才能使它能够读取!在? 如何转义 3 个注释掉的字符,以便将所有保留字符转换为它们的百分比编码?

我会这样做:

@echo off
setlocal EnableDelayedExpansion

set /P "pass=Enter pass: "
echo !pass: =   !

rem Standard cases
for %%a in ("%%=25" "#=23" "$=24" "&=26" "'=27" "(=28" ")=29" "+=2B"
                    ",=2C" "/=2F" ":=3A" ";=3B" "@=40" "[=5B" "]=5D" ) do (
   for /F "tokens=1,2 delims== eol=" %%x in (%%a) do (
      set "pass=!pass:%%x=%%%%y!"
   )
)

rem First two special cases
setlocal DisableDelayedExpansion
set "pass=%pass:!=[21]%"
setlocal EnableDelayedExpansion
set "pass=!pass:[21]=%%21!"
set "pass=!pass:?=%%3F!"

rem Last two special cases
:star
for /F "tokens=1* delims=*" %%x in (" !pass! ") do (
   if "%%y" neq "" (
      set "pass=%%x%%2A%%y"
      set "pass=!pass:~1,-1!"
      goto star
   )
)
:equal
for /F "tokens=1* delims==" %%x in (" !pass! ") do (
   if "%%y" neq "" (
      set "pass=%%x%%3D%%y"
      set "pass=!pass:~1,-1!"
      goto equal
   )
)

echo %pass%

示例:

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