Gnome Terminal,Xshell等终端模拟器中执行命令出现乱码问题解决

一、前言

Xshell跟Gnome Terminal相比,两者都是终端模拟器(在Xshell中也可以执行简单的内置命令,如“cd”,“ls”等),地位相同。

二、原理分析

涉及到乱码,那么需要了解编码解码过程。在终端模拟器中执行命令,通信过程示意图如图1所示。

图1

在以上通信过程中,在“命令执行单元”处发生了一系列的编码解码过程,在“终端模拟器”处也发生了一系列的编码解码过程,此外,我们常常创建SSH连接,从而建立一个远端Shell会话,在该情景中,通信过程示意图如图2所示,由图2可知,在该情景中,跟原来的通信过程相比,只不过“命令执行单元”处与“终端模拟器”处之间的通信数据经过SSH安全通道而已,一般并不影响整体的编码解码过程。

图2

“命令执行单元”处执行命令过程中会发生一系列的编码解码过程,不同命令具有不同实现,因而不同命令执行过程中发生的编码解码过程也不尽相同(以下这些链接中的内容可作为该结论的证据:《使用vi和less查看文本出现中文乱码,使用cat正常》《查看日志文件more正常,用less查看出现乱码》)。另外,很多命令在执行过程中会去读取locale系列环境变量(比如“LANG”,“LANGUAGE”,“LC_ALL”,“LC_CTYPE”等)的配置值用于编码解码过程。

比如“uniq”命令会去使用“LC_COLLATE”等环境变量的配置值,“grep”命令会去使用“LC_ALL”等环境变量的配置值,“vim”命令会去使用“LC_CTYPE”等环境变量的配置值。

“终端模拟器”处执行命令过程中也会发生一系列的编码解码过程,主要有3方面内容:

1、配置终端模拟器使用的编码方案,对于Gnome Terminal,在图3所示位置进行配置,对于Xshell,在图4所示位置进行配置,对于Xftp,在图5所示位置进行配置

2、执行命令时,使用终端模拟器配置的编码方案,对原命令字符串进行编码,将得到的字节流传递给“命令执行单元”

3、展现命令执行结果时,获取字节流形式的命令执行结果,使用终端模拟器配置的编码方案,对其进行解码,得到字符串形式的命令执行结果

图3

图4

图5

三、实验

3.1、ls命令

3.1.1、实验1

现有一个名为“你好吗.txt”的文件,相应于该文件名的存储内容存储的是使用“UTF-8”编码方案编码得到的字节流。

设置不同的locale系列环境变量配置值和终端模拟器编码方案,得到不同的“ls命令”执行结果,具体如表1。

表1

locale系列环境变量配置值 终端模拟器(实验了Gnome Terminal和Xshell)编码方案 ls命令执行结果截图
zh_CN.utf8 UTF-8
zh_CN.gbk UTF-8
zh_CN.utf8 GBK
zh_CN.gbk GBK

3.1.2、实验2

现有一个名为“你好吗.txt”的文件,相应于该文件名的存储内容存储的是使用“GBK”编码方案编码得到的字节流。

设置不同的locale系列环境变量配置值和终端模拟器编码方案,得到不同的“ls命令”执行结果,具体如表2。

表2

locale系列环境变量配置值 终端模拟器(实验了Gnome Terminal和Xshell)编码方案 ls命令执行结果截图
zh_CN.utf8 UTF-8
zh_CN.gbk UTF-8
zh_CN.utf8 GBK
zh_CN.gbk GBK

3.2、vim命令

3.2.1、实验1

现有一个名为“a.txt”的文件,存储有内容“你好吗?”,使用的编码格式为“UTF-8”。

设置不同的locale系列环境变量配置值和终端模拟器编码方案,得到不同的“vim a.txt”执行结果,具体如表3。

表3

locale系列环境变量配置值(跟“3.1、ls命令”一样,也是将locale系列中的所有环境变量的配置值设为同一个值) 终端模拟器(实验了Gnome Terminal和Xshell)编码方案 “vim a.txt”命令执行结果截图 VIM环境中执行“:e ++enc=utf8”结果截图
zh_CN.utf8 UTF-8
zh_CN.gbk UTF-8
zh_CN.utf8 GBK
zh_CN.gbk GBK

3.2.2、实验2

现有一个名为“a.txt”的文件,存储有内容“你好吗?”,使用的编码格式为“GBK”。

设置不同的locale系列环境变量配置值和终端模拟器编码方案,得到不同的“vim a.txt”执行结果,具体如表4。

表4

locale系列环境变量配置值(跟“3.1、ls命令”一样,也是将locale系列中的所有环境变量的配置值设为同一个值) 终端模拟器(实验了Gnome Terminal和Xshell)编码方案 “vim a.txt”命令执行结果截图 VIM环境中执行“:e ++enc=gbk”结果截图
zh_CN.utf8 UTF-8
zh_CN.gbk UTF-8
zh_CN.utf8 GBK
zh_CN.gbk GBK

四、其他

4.1、locale系列环境变量

在以上实验中,locale系列中的所有环境变量的配置值都被设为“zh_CN.gbk”或者“zh_CN.utf8”,其实“ls命令实现”或者“vim命令实现”只需要读取locale系列中特定的部分的环境变量的配置值即可,locale系列中其他的环境变量的配置值并不会影响“ls命令”或者“vim命令”的运行。只不过我们并不知道上述提及的“locale系列中特定的部分的环境变量”是哪些,故而为了简单起见,将locale系列中的所有环境变量的配置值都设为“zh_CN.gbk”或者“zh_CN.utf8”。

4.2、推测vim命令读取文件内容发生的主要的编码解码过程

由“3.2、vim命令”中的实验可推知,使用vim命令读取文件内容中发生的主要的编码解码过程如下:读取文件内容的字节流,使用locale系列环境变量指定的编码方案(也可以通过“:e ++enc=?”命令自己指定要使用的编码方案)对字节流进行解码得到文件内容的字符流,再使用locale系列环境变量指定的编码方案对获得的字符流进行编码得到字节流,将前述编码得到的字节流传递给终端模拟器。

因而,只要locale系列环境变量指定的编码方案跟终端模拟器使用的编码方案一致,那么直接可以得到文件内容的非乱码展现或者通过“:e ++enc=?”命令得到文件内容的非乱码展现。

4.3、实验中用到的两个脚本

脚本1:

#!/bin/bash 

cd /home/dsl/tmp/shell

export LC_ALL=$1
export LANG=$1
export LANGUAGE=$1

locale

echo "---------"
echo "---------"
echo "---------"

ls

脚本2:

#!/bin/bash 

cd /home/dsl/tmp/shell

export LC_ALL=$1
export LANG=$1
export LANGUAGE=$1

locale

echo "---------"
echo "---------"
echo "---------"

vim a.txt
时间: 2024-10-13 04:15:46

Gnome Terminal,Xshell等终端模拟器中执行命令出现乱码问题解决的相关文章

终端模拟器中如何建立日志文件

在终端模拟器中,"日志"是记录我们在使用这款软件时产生的数据,其中包括:使用时间.xshell连接状态等等,所以很多时候日志建立是非常重要的,我们可以回顾之前的日志记录来寻找我们想要的数据.下面就一起来学习如何建立Xshell日志文件,请看下面的详解. Xshell软件获取地址:http://wm.makeding.com/iclk/?zoneid=18724 启动xshell之后,当我们开始建立或者连接远程服务器之前,可以先将日志文件建立好,这样就很方便了. 步骤一:点击窗口上方第一

linux中执行命令权限不够怎样处理

在linux中执行命令权限不够就要增加权限,先看遇到的情况 查看权限情况 那就赋予权限 执行命令

python系统管理第1章,python中执行命令,python函数,面向对像编程,通过import语句实现代码复用

1.Python中执行命令 例子1: [[email protected] opt]# cat pyls.py  #!/usr/bin/env python #python wrapper for the ls command import subprocess     subprocess.call(["ls","-l"]) 例子2: [[email protected] opt]# cat pysysinfo.py  #!/usr/bin/env python

Android 在Android代码中执行命令行

1.路径最好不要是自己拼写的路径/mnt/shell/emulated/0/wifidog.conf 最好是通过方法获取的路径,不然可能导致命令无效  (挂载点的原因) public static final String SDCARD_ROOT=Environment.getExternalStorageDirectory().getAbsolutePath(); public static final String AAA_PATH=SDCARD_ROOT+"/wifidog.conf&qu

cmd中执行命令提示需要提升权限

win7做的这个安全机制有点2B,哎!安全性到了,但是可用性就差了. 这里给同学们分享一个冷知识,如果你打开cmd,在里面执行命令,提示权限不足时,关闭cmd窗口,打开运行窗口,输入cmd console,回车,这样打开的cmd窗口是用超级管理员打开的,这样再运行一些命令的时候,就不会提示权限不足了. 不太明白的同学看这里: 1:win+r 2:cmd console 这里再分享一个小窍门,如果飞秋feiQ无法显示表情图片,可以在feiQ程序上面右键点击用管理员身份运行,这样feiQ就能显示图片

hadoop中执行命令时发生错误

通过一下方式找到错误的原因,开启hadoop的调试信息 [[email protected] bin]# export HADOOP_ROOT_LOGGER=DEBUG,console 这样在执行命令时,可以通过error字样定位执行命令时产生错误的原因 [[email protected] bin]# ./hadoop fs -mkdir test14/10/08 11:17:55 DEBUG util.Shell: setsid exited with exit code 014/10/08

Linux 中执行命令

第一步: 在txt文件(文件名为cmd_file)中写入代码:echo this is content! 第二步: 授权chmod 555 cmd_file 第三步: 运行 ./cmd_file -------------------------------------------------------------------------------------------------------------------------------- ./ 表示当前目录,cmd_file是在当前目

python中执行命令行read结果

import os r = os.popen('python -V').read() print(type(r)) print(r) # os.system('python -V') # os.system('tree') 退出进程 size_str = os.popen('adb shell wm size').read() if not size_str: print('请安装 ADB 及驱动并配置环境变量') sys.exit() 原文地址:https://www.cnblogs.com/

PuTTY 连接 linux 服务器执行 make menuconfig 乱码问题解决

PuTTY 连接 linux 服务器执行 make menuconfig 时可能出现乱码,如下图所示: 有两个方法解决这个问题: 方法一: 修改 PuTTY 配置如下图所示: 方法二: 在 -/.bashrc 配置文件中添加环境变量: export NCURSES_NO_UTF8_ACS=1 修改后正常显示效果: 原文地址:https://www.cnblogs.com/gctech/p/11005855.html