AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 449003
Accepted
Ole Tange
Ole Tange
Asked: 2018-06-11 13:36:08 +0800 CST2018-06-11 13:36:08 +0800 CST 2018-06-11 13:36:08 +0800 CST

bash 中不再显示非 ascii 字符

  • 772

更新:这不是文件系统问题。

我以前可以输入:

$ echo kødpålæg

但现在 bash/zsh 将其更改为:

bash$ echo kddddddddplg
zsh$ echo k<c3><b8>dp<c3><a5>l<c3><a6>g

我可以毫无问题地运行cat并输入“kødpålæg”:

$ cat
kødpålæg
kødpålæg

这两者都适用于这种环境:

$ locale   
LANG=C
LANGUAGE=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C

在这个:

$ locale 
LANG=da_DK.utf8
LANGUAGE=da_DK.utf8
LC_CTYPE="da_DK.utf8"
LC_NUMERIC="da_DK.utf8"
LC_TIME="da_DK.utf8"
LC_COLLATE="da_DK.utf8"
LC_MONETARY="da_DK.utf8"
LC_MESSAGES="da_DK.utf8"
LC_PAPER="da_DK.utf8"
LC_NAME="da_DK.utf8"
LC_ADDRESS="da_DK.utf8"
LC_TELEPHONE="da_DK.utf8"
LC_MEASUREMENT="da_DK.utf8"
LC_IDENTIFICATION="da_DK.utf8"
LC_ALL=da_DK.utf8

csh不会改变“kødpålæg”。

如何恢复旧行为,以便输入“kødpålæg”?

运行其中任何一个都会产生旧的行为:

LC_ALL=en_GB.utf-8 luit
LC_ALL=da_DK.utf-8 luit
LC_ALL=en_GB.iso88591 luit
LC_ALL=da_DK.iso88591 luit

但仅限于那一次会议。

这个:

$ od -An -vtx1
ø

给出:

 c3 b8 0a

因此,从 Konsole 到 bash 的输入似乎是 UTF8。

$ konsole --version
QCoreApplication::arguments: Please instantiate the QApplication object first
Qt: 5.5.1
KDE Frameworks: 5.18.0
Konsole: 15.12.3

$ bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ zsh --version
zsh 5.1.1 (x86_64-ubuntu-linux-gnu)

$ dpkg -l csh
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name              Version       Architecture  Description
+++-=================-=============-=============-========================================
ii  csh               20110502-2.1u amd64         Shell with C-like syntax
bash locale
  • 2 2 个回答
  • 1864 Views

2 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2018-06-12T00:29:33+08:002018-06-12T00:29:33+08:00

    我想说很可能您的终端配置错误,并以某些单字节字符集发送和显示字符,可能是 ISO8859-1 或 ISO8859-15,因为您显示的示例字符而不是语言环境的字符集。

    C 语言环境中通常没有ø, å,æ字符,并且这些字符(0xf8、0xe5、0xe6)的 ISO8859-1(5) 编码不会在 UTF-8 中形成有效字符。像 readline 或 zle 这样的行编辑器需要将它们解码为字符,因为它们需要知道有多少字节组成一个显示列,以便它们可以正确定位光标。

    此外,在大多数系统上使用 ASCII 的 C 语言环境中,由于 ASCII 中没有设置第 8位的字符,因此第8位将被理解bash为含义Meta。0xF8 将被理解为含义Meta+x(0x78 (x) | 0x80),因为这是某些终端在Alt+xor上发送的内容Meta+x。

    虽然默认情况下 Mx 未绑定到任何内容bash,ß但将被理解为 M-_ 并插入最后一个单词。您可以使用以下方法关闭它:

    bind 'set convert-meta off'
    

    Shellcsh太古老了,甚至无法意识到字符可能由几个字节组成,或者占用除单个列宽之外的任何内容,因此它们不会打扰。

    要验证该理论,请运行:

    od -An -vtx1
    

    然后输入这些字符,然后^D^D查看您看到的编码。如果你看到 0xf8 ø,那意味着我是对的。如果您看到的是 0xc3 0xb8 ,那是 UTF-8 编码,ø这意味着我错了。

    或者将语言环境更改为da_DK.iso88591(检查locale -a系统上语言环境的确切名称),看看是否效果更好。

    现在至于为什么您的终端可能会为这些字符发送错误的编码,也许它是在字符集为 iso8859-1 的语言环境中启动的。也许它被配置为忽略语言环境并使用特定的字符集(在其配置中查找字符集或编码)。或者,也许您已经ssh从另一个系统中编辑,其中语言环境使用 ISO8859-1(5) 作为其字符集。

    如果从 UTF-8 终端运行,我可以重现该行为:

    LC_ALL=en_GB.iso885915 luit
    

    并从内部luit将语言环境更改为CUTF-8 或 UTF-8 并输入非 ASCII 字符。

    • 4
  2. telcoM
    2018-06-12T00:07:58+08:002018-06-12T00:07:58+08:00

    您的cat测试表明终端连接是 8 位干净的。所以这似乎是一个可能的语言环境问题。

    请运行locale -a以验证您选择的语言环境“da_DK.utf8”是否存在;如果它没有被列出,并且你在一个属于 Debian/Ubuntu 家族的系统上,你可能必须取消它的注释,/etc/locale.gen然后locale-gen以 root 身份运行。

    此外,某些 shell 版本无法动态切换语言环境,但会继续使用最初从其父进程继承的语言环境设置。如果是这种情况,则运行LC_CTYPE=da_DK.UTF-8 bash将仅在该特定会话期间恢复所需的行为。如果这是真的,那么将系统默认语言环境更改为任何受支持的 UTF-8 语言环境,然后重新启动可能会有所帮助:它会更改负责处理您的登录和启动 shell 的进程的语言环境。

    • 0

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve