`
tmrp
  • 浏览: 44728 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Vi 打开txt文件乱码问题

阅读更多
.vimrc中或.exrc中设置
Q:
1)通常在非中文编码方式的文本中输入中文后,vi不能保存文件.错误信息如下:
test.txt" 不能写入 -- 转换失败
请按 ENTER 或其它命令继续
2)而且删除中文字符时,总是半个半个的删除,过长的行还会显示乱码.

A:
在用户的home目录下的.vimrc或.exrc文件中,加入
set encoding=cp936或set encoding=gb2312;则很好地可以解决这些问题,如果没有这个文>件,可以自己建立.

Q:
如果文本文件的编码是utf-8 Unicode,用vi打开会乱码.

A:
在用户的home目录下的.vim或.exrc文件中(如果没有自己建立).加入
1)set encoding=cp936或set encoding=gb2312;
2)set fileencodings=utf-8
则可以正常编辑GB和utf-8文件.

Q:
如何用vi实现文本的编码转换?

A:
(1)进入空白的vi界面,在命令行修改文件的编码方式,如下
:set encoding=gb2312 fileencodings=utf-8
或set encoding=cp936 fileencodings=utf-8
这时,打开utf-8文本(:e filename),则可以正常编辑.

(2)如果想转换成gb2312,或cp936编码方式,则输入下列命令
:set encoding=gb2312 fileencodings=gb2312 fileencoding=gb2312

:set encoding=cp936 fileencodings=cp936 fileencoding=cp936
存档即实现了文本的utf-8-->GB的编码转换.

(3)反之亦然.
打开GB编码的文本后,
:set encoding=cp936 fileencodings=utf-8 fileencoding=utf-8

存档即实现了文本的GB-->utf-8的编码转换.

vim中编辑不同编码的文件时需要注意的一些地方

此文讲解的是vim编辑多字节编码文档(中文)所要了解的一些基础知识,注意其没有涉及gvim,纯指字符终端下的vim。

vim编码方面的基础知识:

1,存在3个变量:

encoding—-该选项使用于缓冲的文本(你正在编辑的文件),寄存器,Vim 脚本文件等等。你可以把 ‘encoding’ 选项当作是对 Vim 内部运行机制的设定。

fileencoding—-该选项是vim写入文件时采用的编码类型。

termencoding—-该选项代表输出到客户终端(Term)采用的编码类型。

2,此3个变量的默认值:
encoding—-与系统当前locale相同,所以编辑文件的时候要考虑当前locale,否则要设置的东西就比较多了。

fileencoding—-vim打开文件时自动辨认其编码,fileencoding就为辨认的值。为空则保存文件时采用encoding的编码,如果没有修改encoding,那值就是系统当前locale了。

termencoding—-默认空值,也就是输出到终端不进行编码转换。

由此可见,编辑不同编码文件需要注意的地方不仅仅是这3个变量,还有系统当前locale和、文件本身编码以及自动编码识别、客户运行vim的终端所使用的编码类型3个关键点,这3个关键点影响着3个变量的设定。
如果有人问:为什么我用vim打开中文文档的时候出现乱码?

答案是不确定的,原因上面已经讲了,不搞清楚这3个关键点和这3个变量的设定值,出现乱码是正常的,倒是不出现乱码那反倒是凑巧的。

再来看一下常见情况下这三个关键点的值以及在这种情况下这3个变量的值:

1,locale—-目前大部分Linux系统已经将utf-8作为默认locale了,不过也有可能不是,例如有些系统使用中文locale zh_CN.GB18030。在locale为utf-8的情况下,启动vim后encoding将会设置为utf-8,这是兼容性最好的方式,因为内部处理使用utf-8的话,无论外部存储编码为何都可以进行无缺损转换。locale决定了vim内部处理数据的编码,也就是encoding。

2,文件的编码以及自动编码识别—-这方面牵扯到各种编码的规则,就不一一细讲了。但需要明白的是,文件编码类型并不是保存在文件内的,也就是说没有任何描述性的字段来记录文档是何种编码类型的。因此我们在编辑文档的时候,要么必须知道这文档保存时是以什么编码保存的,要么通过另外的一些手段来断定编码类型,这另外的手段,就是通过某些编码的码表特征来断定,例如每个字符占用的字节数,每个字符的ascii值是否都大于某个字段来断定这个文件属于何种编码。这种方式vim也使用了,这就是vim的自动编码识别机制了。但这种机制由于编码各式各样,不可能每种编码都有显著的特征来辨别,所以是不可能100%准确的。对于我们GB2312编码,由于其中文是使用了2个acsii值高于127的字符组成汉字字符的,因此不可能把gb2312编码的文件与latin1编码区分开来,因此自动识别编码的机制对于gb2312是不成功的,它只会将文件辨识为latin1编码。此问题同样出现在gbk,big5上等。因此我们在编辑此类文档时,需要手工设定encoding和fileencoding。如果文档编码为utf-8时,一般vim都能自动识别正确的编码。

3,客户运行vim的终端所使用的编码类型—-同第二条一样,这也是一个比较难以断定的关键点。第二个关键点决定着从文件读取内容和写入内容到文件时使用的编码,而此关键点则决定vim输出内容到终端时使用的编码,如果此编码类型和终端认为它收到的数据的编码类型不同,则又会产生乱码问题。在linux本地X环境下,一般终端都认为其接收的数据的编码类型和系统locale类型相符,因此不需关心此方面是否存在问题。但如果牵涉到远程终端,例如ssh登录服务器,则问题就有可能出现了。例如从1台locale为GB2310的系统(称作客户机)ssh到locale为utf-8的系统(称作服务器)并开启vim编辑文档,在不加任何改动的情况下,服务器返回的数据为utf-8的,但客户机认为服务器返回的数据是gb2312的,按照gb2312来解释数据,则肯定就是乱码了,这时就需要设置termencoding为gb2312来解决这个问题。此问题更多出现在我们的windows desktop机远程ssh登录服务器的情况下,这里牵扯到不同系统的编码转换问题。所以又与windows本身以及ssh客户端有很大相关性。在windows下存在两种编码类型的软件,一种是本身就为unicode编码方式编写的软件,一种是ansi软件,也就是程序处理数据直接采用字节流,不关心编码。前一种程序可以在任何语言的windows上正确显示多国语言,而后一种则编写在何种语言的系统上则只能在何种语言的系统上显示正确的文字。对于这两种类型的程序,我们需要区别对待。以ssh客户端为例,我们使用的putty是unicode软件,而secure CRT则是ansi 软件。对于前者,我们要正确处理中文,只要保证vim输出到终端的编码为utf-8即可,就是termencoding=utf-8。但对于后者,一方面我们要确认我们的windows系统默认代码页为cp936(中文windows默认值),另一方面要确认vim设置的termencoding=cp936。
最后来看看处理中文文档最典型的几种情况和设置方式:

1,系统locale是utf-8(很多linux系统默认的locale形式),编辑的文档是GB2312或GBK形式的(Windows记事本默认保存形式,大部分编辑器也默认保存为这个形式,所以最常见),终端类型utf-8(也就是假定客户端是putty类的unicode软件)

则vim打开文档后,encoding=utf-8(locale决定的),fileencoding=latin1(自动编码判断机制不准导致的),termencoding=空(默认无需转换term编码),显示文件为乱码。

解决方案1:首先要修正fileencoding为cp936或者euc-cn(二者一样的,只不过叫法不同),注意修正的方法不是:set fileencoding=cp936,这只是将文件保存为cp936,正确的方法是重新以cp936的编码方式加载文件为:edit ++enc=cp936,可以简写为:e ++enc=cp936。

解决方案2:临时改变vim运行的locale环境,方法是以LANG=zh_CN vim abc.txt的方式来启动vim,则此时encoding=euc-cn(locale决定的),fileencoding=空(此locale下文件编码自动判别功能不启用,所以fileencoding为文件本身编码方式不变,也就是euc-cn),termencoding=空(默认值,为空则等于encoding)此时还是乱码的,因为我们的ssh终端认为接受的数据为utf-8,但vim发送数据为euc-cn,所以还是不对。此时再用命令:set termencoding=utf-8将终端数据输出为utf-8,则显示正常。

2,情况与1基本相同,只是使用的ssh软件为secure CRT类ansi类软件。

vim打开文档后,encoding=utf-8(locale决定的),fileencoding=latin1(自动编码判断机制不准导致的),termencoding=空(默认无需转换term编码),显示文件为乱码。

解决方案1:首先要保证运行secure CRT的windows机器的默认代码页为CP936,这一点中文windows已经是默认设置了。其他的与上面方案1相同,只是要增加一步,:set termencoding=cp936

解决方案2:与上面方案2类似,不过最后一步修改termencoding省略即可,在此情况下需要的修改最少,只要以locale为zh_CN开启vim,则encoding=euc-cn,fileencoding和termencoding都为空即为encoding的值,是最理想的一种情况。

可见理解这3个关键点和3个参数的意义,对于编码问题有很大助力,以后就可以随心所欲的处理文档了,同时不仅仅是应用于vim,在其他需要编码转换的环境里,都可以应用类似的思路来处理问题解决问题。

最后推荐一款功能强大的windows下的ssh客户端—-xshell,它具有类似secure CRT一样的多tab 的ssh窗口的能力,但最为方便的是这款工具还有改变Term编码的功能,这样我们就可以不用频繁调整termencoding,只需在ssh软件里切换编码即可,这是我用过的最为方便的ssh工具。它是商业软件,但非注册用户使用没有任何限制,只是30天试用期超出后会每次启动都提示注册,对于功能没有丝毫影响。
分享到:
评论

相关推荐

    Linux中vi显示中文乱码的问题.docx

    然后,重新打开 vi,中文乱码的问题就解决了。 在了解 vi 编辑器的中文乱码问题之前,需要了解 vi 的一些基本概念。vi 有三个变量:encoding、fileencoding 和 termencoding。encoding 变量用于设置缓冲区的文本...

    tera term中文乱码问题

    2. 打开`/etc/sysconfig/i18n`文件,可以使用`vi`或`nano`等文本编辑器。 3. 修改`LANG`变量的值,使其与Tera Term的编码设置相匹配。如果你知道Tera Term的编码是GB18030,那么可以将其设置为`LANG="zh_...

    vi 出现乱码的解决方案

    在使用SSH连接到远程服务器时,我们常常会使用命令行界面(CLI)中的文本编辑器进行文件编辑,比如vi或vim。...以上步骤可以有效解决SSH通过vim编辑器打开文件时出现的Big5和GB码乱码问题,确保中文字符可以正确显示。

    SecureCRT中文显示乱码问题的解决方法

    问题:vi编辑器编辑文件时文件中的内容中文显示乱码,但是直接使用linux系统terminal打开此文件时中文显示正常,确诊问题出现在客户端即SecureCRT的显示问题 解决方法: 1、修改远程linux机器的配置 [root@rhel ~]#...

    LINUX SSH显示中文乱码解决

    然而,一个常见的问题是当我们在Windows环境下使用SSH客户端(如PuTTY等)连接到Linux服务器时,可能会遇到中文字符显示为乱码的情况。这不仅影响了阅读体验,还可能对系统的维护和开发工作造成不便。本文将详细介绍...

    Labview按行读取带有数字和文字的txt文件,并保存在Excel中

    然后,在打开文件时,设置正确的编码参数。LabVIEW中的Text File I/O函数提供了指定编码的选项。 2. **按行读取文本**: - 使用LabVIEW的"Text File Read"函数可以逐行读取TXT文件。该函数允许你设置读取的行数或...

    redhat enterprise 4加挂u盘过程及汉字乱码问题解决方案

    然后使用`vi`编辑器打开这个文件: ```bash vi 90-storage-policy.fdi ``` 在文件底部找到最后一个`<merge>`标签的行,使用`yy`复制这一行,然后用`p`粘贴到下方。修改复制的行,将`.exec`替换为`.iocharset=utf8`...

    安装oracle中文乱码问题

    ### 安装Oracle时中文乱码问题解决方案 #### 背景介绍 在进行Oracle数据库安装的过程中,很多用户会遇到中文显示为乱码的问题。这一现象不仅降低了用户体验,还可能影响到系统的正常配置与管理。本文将详细介绍如何...

    linux下mysql数据库乱码问题

    使用文本编辑器(如 `vi`)打开该文件,并添加或修改以下配置项: ```ini [mysqld] default-character-set=utf8 [client] default-character-set=utf8 ``` 上述配置指定了服务器端和客户端默认使用的字符集...

    ssh中文乱码解决

    本文介绍了两种解决SSH中文乱码的方法:一是通过修改系统配置文件 `/etc/sysconfig/i18n` 来永久性地解决中文乱码问题;二是通过临时设置环境变量来暂时解决该问题。通常情况下,建议采用第一种方法进行长期解决。...

    linux 字符界面乱码解决方案

    使用vi编辑器打开`/etc/sysconfig/i18n`文件。这个文件是Linux系统用来配置国际化设置的,其中包含了语言环境的相关配置。 2. **修改配置文件**: 在文件中添加以下内容: ```bash LC_ALL=POSIX ``` 这样做...

    c语言字符界面 乱码

    - 确保文件读写时指定正确的编码格式,例如使用`fopen()`函数打开文件时指定编码: ```c FILE *file = fopen("test.txt", "r"); if (file != NULL) { // 读取文件内容... } fclose(file); ``` ##### 3. ...

    linux 中文显示乱码解决办法

    - 如果仍然存在乱码问题,可能需要检查其他相关配置文件,例如X Window系统的配置文件。 - 对于不同的Linux发行版,可能还需要根据具体情况进行调整。 - 如果是在图形界面下遇到乱码问题,还需要确保安装了正确的...

    Linux 下 oracle dbca netca界面乱码

    进入 `/opt/oracle/product/10.2.0/Db_1/bin` 目录,使用vi编辑器打开 `dbca` 文件。将原代码中的 `JRE_DIR=/opt/oracle/product/10.2.0/Db_1/jdk/jre` 修改为: ``` #JRE_DIR=/opt/oracle/product/10.2.0/Db_1/jdk/...

    redhat linux 中文乱码解决方法.doc

    - 使用文本编辑器打开`/etc/profile`文件,可以使用vi编辑器(或者其他如nano等编辑器)进行操作:`vi /etc/profile` - 在文件中添加以下行:`export LC_ALL="zh_CN.GB18030:en_US.UTF-8"`。 - 这一行设置将使得...

    RedHat5.4Oracle11gSqlplus中文乱码解决.doc

    这个问题涉及到四个主要方面:文件名显示乱码、vi编辑器查看中文内容乱码、Sqlplus内部查看中文乱码以及PuTTY终端中中文显示乱码。这些问题的根本原因可能在于缺少中文支持的软件包以及环境变量配置不正确。 首先,...

    UTF8 LV80_UTF8_TXT编码_源码

    1. 打开文件:使用LabVIEW的“打开文件”函数,指定为读取模式,并确保在读取时选择正确的编码方式,如UTF-8。 2. 读取内容:通过“读取文件”函数获取文件内容,注意这里的读取操作需要考虑到UTF-8编码的特点,尤其...

    第十次作业(labview文件创建,打开,编写)

    - `Open Read-Only` 和 `Open Write-Only` 函数:分别用于以只读和只写模式打开文件,确保不会意外修改或丢失数据。 3. **文件编写**: - `File Write String` VI 和 `File Write Array` VI:将字符串或数组数据...

    修改RedHatEnterpriseLinux4.0操作系统字符集解决乱码问题

    1. **打开文件:** 使用文本编辑器打开`/etc/sysconfig/i18n`文件。例如,可以使用`vi`命令: ```sh vi /etc/sysconfig/i18n ``` 2. **查看原始配置:** 原始配置如下所示: ```sh #cat /etc/sysconfig/i18n...

    Linux下用ll命令--显示total等字母时乱码的解决方法.docx

    1. **打开配置文件**:首先,我们需要使用`vi`编辑器打开系统语言配置文件。该文件位于`/etc/sysconfig/i18n`。在终端中输入: ``` vi /etc/sysconfig/i18n ``` 2. **修改LANG变量**:在编辑器中找到包含`LANG`...

Global site tag (gtag.js) - Google Analytics