ImH*_*ere 8

套餐

是的,有几个。该软件包coreutils(在 debian 中默认安装)带有base32base64。他们可以编码或解码:

$ printf '%s' "abc" | base64
YWJj

$ printf '%s' "abc" | base64 | base64 -d
abc
Run Code Online (Sandbox Code Playgroud)

了解使用 echo 可能会添加一个尾随新行,该行将更改生成的 base64 编码字符串:

$ echo "abc" | base64
YWJjCg==
Run Code Online (Sandbox Code Playgroud)

还有其他包在包basezopenssl. 后者通常也是默认安装的,前者不是。

$ printf '%s' "abc" | openssl base64
YWJj
Run Code Online (Sandbox Code Playgroud)

编码

源字符串以任何语言环境(代码页)编码与 base64 编码无关。base64 程序编码字节,而不是字符。

$ printf '%s' "éäì?" | base64 | base64 -d
éäì?
Run Code Online (Sandbox Code Playgroud)

将在任何系统上工作完全相同。好吧,在任何健全的系统中也echo "éäì?"éäì?在命令行上打印。

当然,如果源字符串在一个系统中编码,然后在具有不同语言环境的系统中解码,您很可能会得到一个Mojibake字符串。那不是base64要解决的问题,而是改变字符串的编码来解决的问题。大概与iconv.

$ echo -n "??????" | base64            # in a utf8 locale
0JzQvtGB0LrQstCw
Run Code Online (Sandbox Code Playgroud)

但是,在带有 iso889-5 的西里尔文语言环境中(可能是 ru_RU.ISO-8859-5,还有其他带有西里尔文的语言):

$ echo "0JzQvtGB0LrQstCw" | base64 -d
??????????

$ echo "0JzQvtGB0LrQstCw" | base64 -d | iconv -f utf8 -t iso8859-5
??????
Run Code Online (Sandbox Code Playgroud)

  • @qwr `echo -n` 不可移植。POSIX 规定 `-n` 的行为是:“...实现定义的”。另一方面,`printf '%s'` 具有 POSIX 指定的行为。 (2认同)