linux 中文 乱码_linux 请求参数乱码中文乱码 - CSDN
精华内容
参与话题
  • linux中显示中文乱码的问题

    万次阅读 2010-05-11 20:23:00
    由于在windows下默认是gb编码,而我的vim默认是utf-8(gedit默认也是utf-8),所以打开会成乱码。修改了一下配置文件,使vi支持gb编码就好了。$vi ~/.vimrclet &termencoding=&encodingset fileencodings=utf-8,gbk...

    由于在windows下默认是gb编码,而我的vim默认是utf-8(gedit默认也是utf-8),所以打开会成乱码。修改了一下配置文件, 使vi 支持gb编码就好了。

    $vi  ~/.vimrc

    let &termencoding=&encoding
    set fileencodings=utf-8,gbk

    $:wq

    再 次打开vi ,显示就正常了。

    如果你需要在linux下面用到windows下的文件,拷贝上去后经常发现中文显示乱码。。原因是Windows中默认的文件格式是 GBK(gb2312),而Linux一般都是UTF-8。比较繁琐的方法是在windows下用程序把内容转换为utf-8编码格式的,但是相当麻烦, 而且遇到一个文件转一回。下面介绍一下,在Linux中如何一劳永逸的解决这个问题,查看文件的编码及如何进行对文件进行编码转换。

    查看文件编码
    在Linux中查看文件编码可以通过以下几种方式:
    1.在
    Vim
    中可以直接查看文件编码
    :set fileencoding
    即可显示文件编码格式。
    文件编码转换
    1.如果你只是想查看其它编码格式的文件或者想解决用Vim查看文件乱码的问题,那么你可以在
    ~/.vimrc(在/etc目录下面) 文件中添加以下内容:
    set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936
    其中encoding是vim的默认显示编码格式,fileencodings是vim打开文件时检测的编码格式,存在这种类型的编码即转换为utf-8 编码。
    这样,就可以让vim自动识别文件编码(可以自动识别UTF-8或者GBK编码的文件),其实就是依照fileencodings提供的编码列表尝试,如 果没有找到合适的编码,就用latin-1(ASCII)编码打开。
    2.在Vim中直接进行转换文件编码,比如将一个文件转换成utf-8格式(不好用)
    :set fileencoding=utf-8

    3.iconv 转换,iconv的命令格式如下:(未用)
    iconv -f encoding -t encoding inputfile
    比如将一个UTF-8 编码的文件转换成GBK编码
    iconv -f GBK -t UTF-8 file1 -o file2

    文件名编码转换:

    Linux
    往 windows拷贝文件或者从windows往Linux拷贝文件,有时会出现中文文件名乱码的情况,出现这种问题的原因是因为,windows的文件名 中文编码默认为GBK,而Linux中默认文件名编码为UTF8,由于编码不一致,所以导致了文件名乱码的问题,解决这个问题需要对文件名进行转码。
    在Linux中专门提供了一种工具convmv进行文件名编码的转换,可以将文件名从GBK转换成UTF-8编码,或者从UTF-8转换到GBK。

    首先看一下你的系统上是否安装了convmv,如果没安装的话用在
    http://www.j3e.de/linux/convmv/convmv-1.14.tar.gz
    下载,然后在windows下面解压缩用winscp上传真个目录,之后进入此目录执行make install命令,之后用convmv命令测试是否安装成功,若显示一些命令提示则表示成功了。
    安装。

    下面看一下convmv的具体用法:
    convmv -f 源编码 -t 新编码 [选项] 文件名
    常用参数:
    -r 递归处理子文件夹
    --notest 真正进行操作,请注意在默认情况下是不对文件进行真实操作的,而只是试验。
    --list 显示所有支持的编码
    --unescap 可以做一下转义,比如把%20变成空格
    比如我们有一个utf8编码的文件名,转换成GBK编码,命令如下:
    convmv -f UTF-8 -t GBK --notest utf8编码的文件名

    这样转换以后"utf8编码的文件名"会被转换成GBK编码(只是文件名编码的转换,文件内容不会发生变化)
    vim 编码方式的设置
    和所有的流行文本编辑器一样,Vim 可以很好的编辑各种字符编码的文件,这当然包括UCS-2、UTF-8 等流行的 Unicode 编码方式。然而不幸的是,和很多来自 Linux 世界的软件一样,这需要你自己动手设置。
    Vim 有四个跟字符编码方式有关的选项,encoding、fileencoding、fileencodings、termencoding (这些选项可能的取值请参考 Vim 在线帮助 :help encoding-names),它们的意义如下:
    * encoding: Vim 内部使用的字符编码方式,包括 Vim 的 buffer (缓冲区)、菜单文本、消息文本等。默认是根据你的locale选择.用户手册上建议只在 .vimrc 中改变它的值,事实上似乎也只有在.vimrc 中改变它的值才有意义。你可以用另外一种编码来编辑和保存文件,如你的vim的encoding为utf-8,所编辑的文件采用cp936编码,vim会 自动将读入的文件转成utf-8(vim的能读懂的方式),而当你写入文件时,又会自动转回成cp936(文件的保存编码).
    * fileencoding: Vim 中当前编辑的文件的字符编码方式,Vim 保存文件时也会将文件保存为这种字符编码方式 (不管是否新文件都如此)。
    * fileencodings: Vim自动探测fileencoding的顺序列表, 启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将Unicode 编码方式放到这个列表的最前面,将拉丁语系编码方式 latin1 放到最后面。
    * termencoding: Vim 所工作的终端 (或者 Windows 的 Console 窗口) 的字符编码方式。如果vim所在的term与vim编码相同,则无需设置。如其不然,你可以用vim的termencoding选项将自动转换成term 的编码.这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效,而对 Console 模式的Vim 而言就是 Windows 控制台的代码页,并且通常我们不需要改变它。
    好了,解释完了这一堆容易让新手犯糊涂的参数,我们来看看 Vim 的多字符编码方式支持是如何工作的。
    1. Vim 启动,根据 .vimrc 中设置的 encoding 的值来设置 buffer、菜单文本、消息文的字符编码方式。
    2. 读取需要编辑的文件,根据 fileencodings 中列出的字符编码方式逐一探测该文件编码方式。并设置 fileencoding 为探测到的,看起来是正确的 (注1) 字符编码方式。
    3. 对比 fileencoding 和 encoding 的值,若不同则调用 iconv 将文件内容转换为encoding 所描述的字符编码方式,并且把转换后的内容放到为此文件开辟的 buffer 里,此时我们就可以开始编辑这个文件了。注意,完成这一步动作需要调用外部的 iconv.dll(注2),你需要保证这个文件存在于 $VIMRUNTIME 或者其他列在 PATH 环境变量中的目录里。
    4. 编辑完成后保存文件时,再次对比 fileencoding 和 encoding 的值。若不同,再次调用 iconv 将即将保存的 buffer 中的文本转换为 fileencoding 所描述的字符编码方式,并保存到指定的文件中。同样,这需要调用 iconv.dll由于 Unicode 能够包含几乎所有的语言的字符,而且 Unicode 的 UTF-8 编码方式又是非常具有性价比的编码方式 (空间消耗比 UCS-2 小),因此建议 encoding 的值设置为utf-8。这么做的另一个理由是 encoding 设置为 utf-8 时,Vim 自动探测文件的编码方式会更准确 (或许这个理由才是主要的 ;)。我们在中文 Windows 里编辑的文件,为了兼顾与其他软件的兼容性,文件编码还是设置为 GB2312/GBK 比较合适,因此 fileencoding 建议设置为 chinese (chinese 是个别名,在 Unix 里表示 gb2312,在 Windows 里表示cp936,也就是 GBK 的代码页)。

    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天试用期超出后会每次启动都提示注册,对于功能没有 丝毫影响。

    1、ibus输入法
    Ubuntu 系统安装后已经自带了ibus输入法,在英语环境下默认不启动。
    配置ibus自动启动可以在ubuntu系统菜单上选择System --- Preferences --- Startup Applications,在该窗口中增加一个程序:
    Name: ibus-daemon
    Command: ibus-daemon -d -x -r

    ibus默认提供的中文输入法比较弱智,需要额外安装ibus-pinyin,命令如下:
    sudo apt-get install ibus-pinyin

    这时,还需要将ibus-pinyin输入法启动。在ubuntu系统菜单上选择System --- Preferences --- IBus Preferences,在Input Method页中的“Select an input method”下拉框中选择增加Chinese – Pinyin,就是图标中有个一个大大的“拼”字的那一个,然后点击Add按钮,最后通过Up按钮将该输入法移动到最上面。

    系统重启后,通过Ctrl + 空格即可调出ibus输入法。

    ibus输入法总体来说不错,但是在我的环境下发现无法在部分Java程序中调出来,例如Netbeans、OpenProj。

    2、fcitx输入法
    由于ibus的缺陷,所以我尝试了fcitx,使用下来也非常不错,而且可以在Java程序中正常使用,只是在这种情况下光标跟随有些问题,输入界面会停 留在屏幕最下端,但是可以接受,比起ibus不能使用要好多了。

    安装fcitx:
    sudo apt-get install fcitx

    启动fcitx:
    im-switch -s fcitx

    注销后重新登录,fcitx就会生效。
    如果需要切换回ibus,可以运行im-switch -s ibus,然后注销,重新登录。

    fcitx同样可以通过Ctrl + 空格调出,这时会发现fcitx显示的中文是方框,因此需要修改fcitx的配置。Fcitx的配置文件在~/.fcitx/config,该文件为 GBK编码,在Ubuntu下显示不正常,可以通过如下方式操作:
    cd ~/.fcitx
    iconv -f gbk -t utf8 config > config.tmp

    编辑config.tmp文件:
    显示字体(中)=WenQuanYi Micro Hei

    显示字体大小=10

    使用粗体=0


    保存退出,然后运行命令:
    iconv -f utf8 -t gbk config.tmp > config

    注销后重新登录,fcitx显示正常。

    3、网页上Flash中的中文显示为方框的解决办法
    编辑/etc/fonts/conf.d/49-sansserif.conf文件,作如下修改:
    <edit name="family" mode="append_last">

    <string>WenQuanYi Micro Hei</string>

    </edit>

    4、Java程序部分中文显示为方框的解决办法
    在$JAVA_HOME/jre /lib/fonts目录下建立fallback目录,将中文字体文件复制(或link)到fallback目录。
    sudo mkdir $JAVA_HOME/jre/lib/fonts/fallback
    sudo ln /usr/share/fonts/truetype/wqy/wqy-microhei.ttc $JAVA_HOME/jre/lib/fonts/fallback/

    5、转换文件内容编码
    Windows下生成的纯文本文件,其中文编码为GBK,在Ubuntu下显示为乱码,可以使用iconv命令进行转换:
    iconv -f gbk -t utf8 source_file > target_file

    6、转换文件名编码
    Windows下压缩的zip文件,在 Ubuntu下解开时,中文文件名会显示乱码,可以用convmv解决。
    安装convmv:
    sudo apt-get install convmv

    转换文件或目录:
    convmv -f gbk -t utf8 -r --notest *

    7、解压zip文件乱码
    在Ubuntu下使用unzip解压Widnows环境下生成的zip文件,会发生文件名或者目录名乱码现象,解决办法是使用 7-zip和convmv。

    安装7-zip和convmv:
    sudo apt-get install convmv p7zip-full

    解压zip文件:
    LANG=C 7z e zip_file
    convmv -f gbk -t utf8 -r --notest *

    8、解压rar文件乱码
    在ubuntu下解压Windows环境下生成的rar文件,同样会碰到中文乱码问题,例如使用7z来解压。
    解决办法是使用unrar来解压。
    安装unrar:
    sudo apt-get install unrar

    9、PDF中文乱码
    PDF文件中的中文显示出乱码的情况下,可以安装poppler-data来解决:
    sudo apt-get install poppler-data

    1.在新立得里安装 xpdf-chinese-simplified

    2.下载安装poppler-data-0.1者过程如下:

    下载poppler-data-0.1.tar.gz (也可以到官方下载,这是我随便搜的一个)

    解压放置到/opt文件夹下面。

    打开终端进入该目录:cd /opt/poppler-data-0.1
    运 行命令:sudo make install datadir=/usr/share

    可以了,中文乱码问题部分解决了,但可能有方框的问题,请看下文

    3.Ubuntu 10.04中PDF文档出现方框

    在终端输入

    sudo gedit /etc/fonts/conf.d/69-language-selector-zh-cn.conf

    修改69-language-selector-zh-cn.conf文件如下:

    <fontconfig>
    <match target="pattern">
    <test qual="any" name="family">
    <string>serif</string>
    </test>
    <edit name="family" mode="prepend" binding="strong">
    <string>DejaVu Serif</string>
    <string>AR PL UMing CN</string>
    <string>AR PL UKai CN</string>
    <string>AR PL ZenKai Uni</string>
    <string>AR PL ShanHeiSun Uni</string>
    <string>Bitstream Vera Serif</string>
    <string>WenQuanYi Bitmap Song</string>
    </edit>
    </match>
    <match target="pattern">
    <test qual="any" name="family">
    <string>sans-serif</string>
    </test>
    <edit name="family" mode="prepend" binding="strong">
    <string>WenQuanYi Bitmap Song</string>
    <string>AR PL UMing CN</string>
    <string>AR PL UKai CN</string>
    <string>AR PL ZenKai Uni</string>
    <string>WenQuanYi Zen Hei</string>
    <string>Bitstream Vera Sans</string>
    <string>AR PL ShanHeiSun Uni</string>
    <string>DejaVu Sans</string>
    </edit>
    </match>
    <match target="pattern">
    <test qual="any" name="family">
    <string>monospace</string>
    </test>
    <edit name="family" mode="prepend" binding="strong">
    <string>DejaVu Sans Mono</string>
    <string>Bitstream Vera Sans Mono</string>
    <string>WenQuanYi Bitmap Song</string>
    <string>AR PL UMing CN</string>
    <string>AR PL UKai CN</string>
    <string>AR PL ZenKai Uni</string>
    <string>WenQuanYi Zen Hei</string>
    <string>AR PL ShanHeiSun Uni</string>
    </edit>
    </match>
    </fontconfig>



    10、字体安装
    1) 安装微软字体
    sudo aptitude install msttcorefonts

    2)手工安装其它字体
    在/usr/share/fonts目录下建立字体目录,例如:/usr/share/fonts/myfonts,并将字体文件复制或LINK到该目 录。

    cd /usr/share/fonts/myfonts/
    sudo mkfontscale
    sudo mkfontdir

    * 在不执行以下命令的情况下,结果正常:
    sudo fc-cache -f -v

    11、默认字体配置
    sudo cp /etc/fonts/conf.avail/69-language-selector-zh-cn.conf /etc/fonts/conf.d
    sudo vi /etc/fonts/conf.d/69-language-selector-zh-cn.conf

    12、 Evolution中文附件问题
    使用发现Evolution发送的名称中带有中文的附件,使用Evolution可以正常解析,但是用 Foxmail或者Outlook接收后无法正确解析出附件。解决办法:
    在evolution菜单中选择Edit --- Preferences --- Composer Preferences,在Default Behavior中勾选Encode file names in an Outlook/GMail way。

    展开全文
  • linux中显示中文乱码如何解决?

    千次阅读 2017-12-03 20:28:47
    #第1个里程碑-看看linux系统的字符集 echo $LANG #第2个里程碑-远程连接工具 xshell/SecureCRT/putty 字符集   #第二步-修改 修复 修改字符集 #第一个里程碑-修改xshell字符集(推荐) #第二个里程碑-修改...

    #第一步-排查

    #第1个里程碑-看看linux系统的字符集

    echo $LANG

    #第2个里程碑-远程连接工具 xshell/SecureCRT/putty 字符集

     

    #第二步-修改 修复 修改字符集

    #第一个里程碑-修改xshell字符集(推荐)

    #第二个里程碑-修改linux系统的字符集

    ###1.临时

    export LANG=en_US.UTF-8

    ###2.永久

    [root@oldboyedu-39-nb ~]# cat /etc/sysconfig/i18n

    LANG="en_US.UTF-8"

    SYSFONT="latarcyrheb-sun16"

    ###3.生效

    source/etc/sysconfig/i18n

    展开全文
  • 解决linux环境中出现中文乱码的情况。
  • 解决linux中文文件名显示乱码问题

    千次阅读 2019-04-22 10:44:38
    在windows上使用ftp上传文件到Linux上,中文名称在Linux系统中显示为乱码。虽然将Linux的env设置了LANG=en_US.UTF-8,并且本地的Shell客户端编码也设置成UTF-8,但在Shell中(或通过http访问),仍是乱码…… 原因...

    在windows上使用ftp上传文件到Linux上,中文名称在Linux系统中显示为乱码。虽然将Linux的env设置了LANG=en_US.UTF-8,并且本地的Shell客户端编码也设置成UTF-8,但在Shell中(或通过http访问),仍是乱码……

    原因在于,Windows 的文件名中文编码默认为GBK,压缩或者上传后,文件名还会是GBK编码,而Linux中默认文件名编码为UTF8,由于编码不一致所以导致了文件名乱码的问题,解决这个问题需要对文件名进行转码。

    yum install convmv 
    convmv -f gbk -t utf-8 -r --notest /home/wwwroot 
    • 1
    • 2

    常用参数:

    -r 递归处理子文件夹

    –notest 真正进行操作,默认情况下是不对文件进行真实操作

    –list 显示所有支持的编码

    –unescap 可以做一下转义,比如把%20变成空格

    -i 交互模式(询问每一个转换,防止误操作)

    linux下有许多方便的小工具来转换编码:

    文本内容转换 iconv

    文件名转换 convmv

    mp3标签转换 python-mutagen

    展开全文
  • Linux中文文件名乱码问题的详解

    万次阅读 2016-06-12 10:03:46
    最近做的项目中,涉及Linux下生成中文文件名并压缩打包下载乱码问题,需要将生成的压缩包文件自定义重命名(包括中文),问题来了,Linux下不支持中文的,所以会导致中文乱码问题,网上找了几天,都没解决,现在终于...

    最近做的项目中,涉及Linux下生成中文文件名并压缩打包下载乱码问题,需要将生成的压缩包文件自定义重命名(包括中文),问题来了,Linux下不支持中文的,所以会导致中文乱码问题,网上找了几天,都没解决,现在终于给码出来了,希望大家指出缺点。

    首先,让linux支持中文,就是在/usr/lib/locale的默认中,添加以下三句,或者注释掉这三句前的#

    zh_CN.GBK GBK
    zh_CN.GB18030 GB18030
    zh_CN.UTF-8 UTF-8

    其次,由于下载的文件会把目录整个显示,之前转载别人的文章,
    使用了pathinfo函数去获取他的basename,就避免了目录结构被暴露,
    原来,文字编码中windows默认是GBK,而Linux默认是UTF-8,
    这样就导致输出的是乱码,乱码的文字被自动忽略。
    所以我重新写了一个pathinfo函数 path_info() 。

    分享自己的code:

    if($action == "downreport"){
        if(substr($report_ids,-1)==","){
            $report_ids = substr($report_ids,0,-1);
        }
        $report_id = $report_ids;
    if($report_id == '0'){
    die("{success:false,msg:'error',code:'e8000'}");
    }
        if(strpos($report_id,',')){
            $arrids = explode(',',$report_id);
            $newids = array();
            foreach($arrids as $id){
                $newids []= intval($id);
            }
            $ids = implodeids($newids);
            $reports = array();
            $reports_name = array();
            $paths = array();
            $query = $db->query("select `name`,filename from report_list where id in ($ids)");
            while($report = $db->fetch_array($query)){
                $reports[]= $report['filename'];
                $reports_name[]= $report['name'];
            }
            for($i = 0; $i < count($reports); $i++ ){
                $j = 1;
                $temp_fileName = $reports_name[$i]."_";
                while(file_exists(ESHINE_ROOT."tmp/temp/".$reports_name[$i] .".zip")){
                    $reports_name[$i] = $temp_fileName.$j;
                    $j++;
                }
                //$reports_name[$i] = $temp_fileName;
                copy(ESHINE_ROOT."Report/".$reports[$i].".zip",ESHINE_ROOT."tmp/temp/".$reports_name[$i].".zip");
                $paths[$i] = ESHINE_ROOT."tmp/temp/".$reports_name[$i].".zip";
            }
            //重写pathinfo函数,解决中文被置空 2014.11.26
            function path_info($filepath)
            {
                $path_parts = array();
                $path_parts ['dirname'] = rtrim(substr($filepath, 0, strrpos($filepath, '/')),"/")."/";
                $path_parts ['basename'] = ltrim(substr($filepath, strrpos($filepath, '/')),"/");
                $path_parts ['extension'] = substr(strrchr($filepath, '.'), 1);
                $path_parts ['filename'] = ltrim(substr($path_parts ['basename'], 0, strrpos($path_parts ['basename'], '.')),"/");
                return $path_parts;
            }
            //创建压缩包 2014.11.24
            function create_zip($files=array(),$destination='',$overwrite=false){
                //if the zip file already exists and overwrite is false, return false  
                //如果zip文件已经存在并且设置为不重写返回false  
                if(file_exists($destination) && !$overwrite){
                    return false;
                }
                $valid_files=array();
                //获取到真实有效的文件名  
                if(is_array($files)){
                //cycle through each file  
                    foreach($files as $file){
                        //make sure the file exists  
                        if(file_exists($file)){
                            $valid_files[]=$file;
                        }
                    }
                }
                //如果存在真实有效的文件  
                if(count($valid_files)){
                    //create the archive  
                    $zip = new ZipArchive();
                    //打开文件 如果文件已经存在则覆盖,如果没有则创建  
                    if($zip->open($destination,$overwrite?ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE)!==true){
                        return false;
                    }
                    //向压缩文件add the files  
                    foreach($valid_files as $file){
                        //$zip->addFile($file,$file);
                        //$file_info_arr= pathinfo($file);
                        $file_info_arr =  path_info($file);
                        $filename = $file_info_arr['basename'];
                        $filename = iconv('UTF-8', 'GBK//IGNORE', $filename);
                        //die($filename);
                        $zip->addFile($file,$filename);
                    }
                    $zip->close();
                    //check to make sure the file exists  //检测文件是否存在  
                    return file_exists($destination);
                }else{
                    return false;
                }
            }
            if(create_zip($paths,ESHINE_ROOT."tmp/temp/".$tempFileName.".zip",true)){
                $newfiles =  ESHINE_ROOT."tmp/temp/".$tempFileName.".zip";
            }
            //sleep(1);
            $tempFileName = date("YmdHis",time()).mt_rand(1000, 9999);
            for($i = 0; $i < count($paths); $i++ ){
                @unlink($paths[$i]);
            }
            if(!$newfiles){
                echo 'Not Found' . $newfiles;
                exit;
            }else{
                header("Content-type: application/octet-stream");
                //header("Content-type: application/force-download");
                header("Accept-Ranges: bytes");
                header("Accept-Length: ".filesize($newfiles));
                header("Content-Disposition: attachment; filename=".$tempFileName.".zip");
                //header('Content-Type: application/octet-stream; name=' . $out_filename);
                touch($newfiles);
                $file = fopen($newfiles, "r");
                //echo fread($file, filesize($newfiles));
                $buffer = 1024; //
                //判断文件是否读完
                while (!feof($file)) {
                    //将文件读入内存
                    $file_data = fread($file, $buffer);
                    //每次向客户端回送1024个字节的数据
                    echo $file_data;
                }
                fclose($file);
                unlink($newfiles);
                writelog($msg_download_log_reportlist.$newfiles);
            }
        } 
    }
    展开全文
  • 该文件在用户目录下,对于其他用户,也必须...使用该方法时putty能显示中文,但桌面系统是英文,而且所有的网页中文显示还是乱码 方法二: 修改/etc/sysconfig/i18n文件 #LANG="en_US.UTF-8" #SUPPORTED="en_US....
  • Linux中文乱码显示

    万次阅读 2018-06-05 15:04:16
    可以使用locale命令,查看当前系统默认采用的字符集# locale在RedHat/CentOS系统下,记录系统默认使用语言的文件是/etc/sysconfig/i18n,如果默认安装的是中文的系统,i18n的内容如下:LANG="zh_CN.UTF-8"...
  • 下面要介绍的就是Linux中,各类中文乱码的解决方法。 示例 图中名为一个.sql文件的一段内容,是一个数据库文件。其在windows中打开显示正常,在Linux中,中文部分显示为乱码。 注意:这个与mysql乱码...
  • linux乱码问题

    千次阅读 2018-09-09 09:10:48
    对于国内的Linux用户,经常烦恼的一个问题是:系统常常在需要显示中文的时候却显示成了乱码,而由于某些原因,需要英文界面的系统的时候,却苦于系统不能正常输入和显示中文.另外,由于大部分主要Linux发行版都是以英语为...
  • linux系统中文乱码

    2020-04-09 11:50:57
    Linux系统如果对中文不支持,在处理中文时会提示错误,比如: 'latin-1' codec can't encode character u'\u017e' in position 11: ordinal not in range(256) 不管如何encoding、decoding都不能解决问题。 解决...
  • linux中文乱码问题解决

    千次阅读 2019-05-06 15:06:12
    linux中文乱码问题解决 大家好,我依旧是你们帅气可爱迷人的猪猪,相信很多小伙伴在开始使用Linux的时候,都会遇到一个问题,就是终端输入命令回显的时候中文显示乱码。出现这个情况一般是由于没有安装中文语言包,...
  • putty连接Linux中文乱码解决方案

    千次阅读 2016-07-27 17:39:40
    putty连接Linux中文乱码解决方案标签:Linux 中文乱码putty连接Linux中文乱码解决方案问题描述:使用putty连接Linux后中文显示乱码在Linux中输入LANG=zh_CN.utf-8 点击Putty左上角的图标,找到Change Settings,再...
  • Arch Linux中文乱码解决

    2019-08-09 04:41:26
    Arch Linux中文乱码解决 1.安装中文字体 pacman -S wqy-zenhei ttf-fireflysung (flash乱码) ---乱码的原因就是缺少中文字体的支持,下载文泉驿xx, OK了 /etc/locale.gen 设置en_US.UTF8 UTF-8 zh_...
  • 解决Linux中文乱码

    万次阅读 2011-06-13 01:11:00
     修改/root/.bash_profile文件,增加export LANG=zh_CN.GB18030该文件在用户目录底下对于其他用户,也必须相应修改该文件 使用该方法时putty能显示中文,但桌面系统是英文,而且所有的网页中文显示还是乱码方法二...
  • Linux中文乱码问题

    2019-01-10 15:24:39
    linux出现中文乱码,导致部署的服务也跟着报错,根据各方面的查资料,确认为有人升级了GLIBC导致,GLIBC的2.13和2.14版本会影响linux系统编码,导致中文乱码(不明白其中的原理)。  可以执行以下命令查询GLIBC的...
  • C++ linux中文乱码

    千次阅读 2016-10-10 10:59:20
    中文注释无法正常显示。 l 运行过程中,中文字符串比较失败。 百思不得骑姐。在查阅一番资料,多次测试后,确定这都是字符集的问题。 1. 中文注视无法正常显示 windows的默认编码方式是Ansi,而Ubuntu ...
  • 解决linux中文乱码

    2012-09-10 09:03:16
    这种方式只能治标不能治本,下次使用ssh连linux时还是会乱码, 现在将我自己的解决方式共享给大家。 编辑/etc/sysconfig/i18n 将文件中的 LANG="zh_CN.UTF-8" 修改为 LANG="zh_CN.GB2312" 。 重新
  • linux 汉字乱码 window中正常显示 修改tomcat的配置文件 &lt;Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000"  redirectPort="8443"   /...
  • Matlab for Linux中文乱码

    千次阅读 2013-04-01 21:48:50
    有Matlab的Linux版本中文乱码这个问题由来已久了。。。网上的办法一搜一大片,曾经满腔热血的试了好几个办法,很可悲的是没有一个能成功。。。。后来自己索性不管了,大不了用英文呗。。。今天从BBS上下了罗大牛的一...
  • WINDOWS上传文件到LINUX中文乱码

    万次阅读 2015-03-03 19:10:45
    现象:WINDOWS上传文件到LINUX后,中文文件名乱码中文内容乱码 解决:首先考虑到的应该是字符编码不一致导致,其次再看是否没安装中文包 1:检查是否安装convmv工具 [oracle@result tmp]$ rpm -qa |grep convmv...
1 2 3 4 5 ... 20
收藏数 55,115
精华内容 22,046
关键字:

linux 中文 乱码