我在使用ssh远程服务器(我没有管理员访问权限)时遇到了一些问题- 具体来说,那里有几个包含韩语和西里尔文文本的文件夹。
当我用 显示父文件夹内容时ls,字符被转义为“?”。也许值得注意的是,韩文字符似乎比应该存在的字符数多得多。
我知道我使用的终端程序可以显示字符,因为使用sftp可以完美显示它们。我尝试过的所有终端都会出现问题。
机器概要
本地机器:
远程服务器:
我可能错过了一些其他重要的统计数据或一些信息,在这种情况下,我深表歉意。我对计算的整个非 Windows 方面还很陌生,所以我几乎不知道我在这里做什么。
有什么方法可以检索当前语言环境中给定字符类(如blank, alpha, digit...)中所有字符的列表。
例如,
LC_ALL=en_GB.UTF-8 that-command blank
Run Code Online (Sandbox Code Playgroud)
理想情况下,在我的 Debian 系统上,会显示如下内容:
09 U+0009 HORIZONTAL TAB
20 U+0020 SPACE
e1 9a 80 U+1680 OGHAM SPACE MARK
e1 a0 8e U+180E MONGOLIAN VOWEL SEPARATOR
e2 80 80 U+2000 EN QUAD
e2 80 81 U+2001 EM QUAD
e2 80 82 U+2002 EN SPACE
e2 80 83 U+2003 EM SPACE
e2 80 84 U+2004 THREE-PER-EM SPACE
e2 80 85 U+2005 FOUR-PER-EM SPACE
e2 80 86 U+2006 SIX-PER-EM SPACE
e2 80 88 …Run Code Online (Sandbox Code Playgroud) 该命令cut有一个选项-c可以处理字符,而不是带有选项的字节-b。但这似乎不起作用,在en_US.UTF-8语言环境中:
第二个字节给出了第二个 ASCII 字符(在 UTF-8 中编码完全相同):
$ printf 'ABC' | cut -b 2
B
Run Code Online (Sandbox Code Playgroud)
但不会在 UTF-8 语言环境中给出三个希腊非 ASCII 字符中的第二个:
$ printf '???' | cut -b 2
?
Run Code Online (Sandbox Code Playgroud)
没关系 - 这是第二个字节。
所以我们看第二个字符:
$ printf '???' | cut -c 2
?
Run Code Online (Sandbox Code Playgroud)
那看起来坏了。
通过一些实验,结果表明范围3-4显示了第二个字符:
$ printf '???' | cut -c 3-4
?
Run Code Online (Sandbox Code Playgroud)
但这与字节 3 到 4 相同:
$ printf '???' | cut -b 3-4
?
Run Code Online (Sandbox Code Playgroud)
所以-c不超过-b …
表情符号似乎使用 U+xxxxx 格式指定,
其中每个 x 是一个十六进制数字。
例如,U+1F615是“困惑的脸”的官方 Unicode Consortium 代码
由于我经常感到困惑,我对这个符号有很强的亲和力。
该U + 1F615表示是混淆我,因为我认为有可能为Unicode字符的唯一编码所需的8,16,24或32位,而5个十六进制数字需要5×4 = 20比特。
我发现这个符号在 bash 中似乎由一个完全不同的十六进制字符串表示:
$echo -n | hexdump
0000000 f0 9f 98 95
0000004
$echo -e "\xf0\x9f\x98\x95"
$PS1=$'\xf0\x9f\x98\x95 >'
>
Run Code Online (Sandbox Code Playgroud)
我本来希望U+1F615转换为类似\x00 \x01 \xF6 \x15 的东西。
我没有看到这两种编码之间的关系?
当我在官方 Unicode Consortium 列表中查找符号时,我希望能够直接使用该代码,而不必以这种繁琐的方式手动转换它。IE
我可以使用这个 20 位代码来确定 32 位代码是什么吗?
这两个数字之间是否存在关系?
当我ssh进入我的 VPS 时,我irssi在屏幕上运行。当有人发送 unicode 字符(例如 © 或 €)时,irssi当我在ssh会话中通过屏幕使用它时会显示垃圾。如果我irssi使用 irssi 的代理模块连接到它,从我本地计算机上运行的 irssi,它会正确显示。
同样,如果我在 VPS(屏幕外)上运行 ghci 并输入其中一个字符,它就会崩溃。
因此,显然,无论是在 ssh 还是系统设置中,我与 VPS 的连接都存在某种字符编码问题。
我怎样才能找出导致这种情况的原因并解决它?
细节:
客户系统
VPS系统
我正在运行 CentOS 7.9,今天我的终端显示奇怪的字符。有些字母看起来不错,但有些符号显示为一些非英文字符。例如,我制作了一个包含以下内容的文本文件:
!@#$%^&*()_+{}
Run Code Online (Sandbox Code Playgroud)
当我打开这个vi或者nano它看起来正如我上面写的是正确的。但在终端中它看起来像这样:
$ cat chars.txt
!É#$%Ü&*()_+äå
$ od -An -vtx1 < chars.txt
21 40 23 24 25 5e 26 2a 28 29 5f 2b 7b 7d 0a
Run Code Online (Sandbox Code Playgroud)
这些奇怪的字符随处可见,即使在我打字时也是如此。这台机器一直工作到今天。我认为这是在我下载了一个二进制文件curl并忘记使用该-O参数之后发生的。重新启动并以其他用户身份登录没有帮助。我的语言环境设置如下;我不知道还有什么要找的。我使用的 shell 是 Bash 4.2 版,没什么异常。
$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Run Code Online (Sandbox Code Playgroud)
编辑:说服务器的外壳是 bash 4.2 会更准确。我在 macOS Big Sur 上使用 Terminal.app 登录。
在某些程序中,如htop线条和框架显示不正确。相反,它们显示为-和/。

但在另一台机器上,它们正确显示为正确的行:

我不确定这是否是终端问题,或者是否需要某些软件包。
如果相关:我的系统是 Debian Wheezy,我的解释器是bash,我的终端模拟器是gnome-terminal
我已经知道vim -b,但是,根据所使用的语言环境,它将多字节字符(如 UTF-8)显示为单个字母。
vim无论字符集如何,我如何要求只显示 ASCII 可打印字符,并将其余字符视为二进制数据?
在尝试将文本文件转换为其 ASCII 等效文件时,我收到错误消息iconv: illegal input sequence at position.
我使用的命令是 iconv -f UTF-8 -t ascii//TRANSLIT file
冒犯的字符是æ。
文本文件本身存在于此处。
为什么说是非法序列?输入字符是正确的 UTF-8 字符 (U+00E6)。
作为一名 C 程序员,我惊讶地看到wc -c(计算字节数)和wc -m(计算字符数)对于我的一个长文本文件输出非常不同的结果。我一直被告知那sizeof(char)是 1 个字节。
qdii@nomada ~/Documents $ wc -c sentences.csv
102990983 sentences.csv
qdii@nomada ~/Documents $ wc -m sentences.csv
89023123 sentences.csv
Run Code Online (Sandbox Code Playgroud)
有什么解释吗?