什么是 `â<80><98>` 以及如何避免它?

uav*_*uav 2 vim character-encoding find

我做一个

cd /folder/ && find . -not \( -path ./exclude_folder -prune \) > /log.log
Run Code Online (Sandbox Code Playgroud)

并得到

find: â<80><98>./qs/www/ergebnisse/validitaet/0df21b8a-e227-47b2-aaa5-9f54d1f9b8fd.txtâ<80><99>: No such file or directory
Run Code Online (Sandbox Code Playgroud)

日志文件里面。没错,但是:

这是什么â<80><98>(和â<80><99>)?这些是颜色代码吗?如何避免它们(find没有--no-color)?


坚持,稍等。当我做cat log.log而不是vi log.log我得到:

find: ‘./qs/www/ergebnisse/validitaet/0df21b8a-e227-47b2-aaa5-9f54d1f9b8fd.txt’: No such file or directory
Run Code Online (Sandbox Code Playgroud)

Ral*_*edl 7

您的发行版使用 UTF-8 字符编码。这对于大多数当前的发行版来说是正常的。
您看到的是 UTF-8 编码字符显示为另一种编码的效果。

许多 GNU 实用程序尝试使用不同的引号来打开和关闭引号。对于某些字体,这看起来不错,而其他字体则不太好。

让我们看看由 产生的输出find

$ find /x 2>&1 | hexdump -C
00000000  66 69 6e 64 3a 20 e2 80  98 2f 78 e2 80 99 3a 20  |find: .../x...: |
Run Code Online (Sandbox Code Playgroud)

在 之前和之后,/x我们有序列e2 80 98e2 80 99

您的控制台已配置为 UTF-8,并且能够正确显示 UTF-8 序列。该cat程序无法识别或关心这个序列,所以也没有问题。

另一方面,您vi将文件解释为 latin1。这至少在现代发行版中是不寻常的。在latin1的,第一个字节,e2被解释为â同时809899在latin1的无效并显示为<80>等。这导致â<80><98>â<80><99>

如何避免这种情况?您可以将您的vi文件配置为以 UTF-8 显示文件,或者您可以避免输出中的 UTF-8 序列。

$ LC_CTYPE=C find /x 2>&1 | hexdump -C
00000000  66 69 6e 64 3a 20 27 2f  78 27 3a 20   |find: '/x': |
Run Code Online (Sandbox Code Playgroud)

这里find不生成 UTF-8 序列,而是使用单引号'作为开始和结束引号。

请注意,禁用 UTF8 可能会改变程序处理输入的方式,尽管在您的示例中这无关紧要。