1、目录 基础知识 1 1.概念 1 查看字符集 2 1.查看环境变量字符集 2 2.在Vim中可以直接查看文件编码 3 文件的转码 4 文件名编码转换: 4 修改字符集的方法 5 1.直接设置变量的方式修改 5 2.修改配置文件 6 涉及到字符集的一些问题 8 Apache中的乱码问题 10 Mysql乱码的问题 12 php中乱码的问题 14 基础知识 1.概念 字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Character set)是多个字符的集合,字符
2、集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等 ASCII ASCII(American Standard Code for Information Interchange,美国信息互换标准编码)是基于罗马字母表的一套电脑编码系统。主要包含,控制字符:回车键、退格、换行键等。可显示字符:英文大小写字符、阿拉伯数字和西文符号。7位(bit)表示一个字符,共128字符,字符值从0到127,其中32到127是可打印的字符。 GB2312 GB2312又称为GB2312-8
3、0字符集,全称为《信息交换用汉字编码字符集·基本集》,由原中国国家标准总局发布,1981年5月1日实施。GB2312是中国国家标准的简体中文字符集。它所收录的汉字已经覆盖99.75%的使用频率,基本满足了汉字的计算机处理需要。在中国大陆和新加坡获广泛使用。 BIG5 Big5码的产生,是因为当时台湾不同厂商各自推出不同的编码,如倚天码、IBM PS55、王安码等,彼此不能兼容;另一方面,台湾政府当时尚未推出官方的汉字编码,而中国大陆的GB2312编码亦未有收录繁体中文字。 GB18030 GB 18030的全称是GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,
4、是我国政府于2000年3月17日发布的新的汉字编码国家标准,2001年8月31日后在中国市场上发布的软件必须符合本标准。 Unicode 在计算机科学领域中,Unicode(统一码、万国码、单一码、标准万国码)是业界的一种标准,它可以使电脑得以体现世界上数十种文字的系统。Unicode 是基于通用字符集(Universal Character Set)的标准来发展。它是字符集,UTF-32/UTF-16/UTF-8是三种字符编码方案。 查看字符集 1.查看环境变量字符集 字符集在系统中体现形式是一个环境变量,以redhat为例(bshell)其查看当前终端使用字符集的方式可以
5、有以下几种方式。 locale 命令将有关当前语言环境或全部公共语言环境的信息写到标准输出上。公共语言环境是所有应用程序可以使用的语言环境。语言环境称为"locale". 它不仅包括语言和货币单位, 而且还包括数字标示格式, 日期和时间格式. 国际化了的软件含有一个"locale"的"参量", 使用该"locale"参量便可以设置某一区域所用的语言环境。 locale的命名规则为<语言>_<地区>.<字符集编码>,如zh_CN.UTF-8,zh代表中文,CN代表大陆地区,UTF-8表示字符集。在locale环境中,有一组变量,代表国际化环境中的不同设置。 2.在Vim中可以直
6、接查看文件编码 Vim中关于字符的几个选项 在 Vim 中,有四个与编码有关的选项,它们是:fileencodings、fileencoding、encoding 和 termencoding。在实际使用中,任何一个选项出现错误,都会导致出现乱码。因此,每一个 Vim 用户都应该明确这四个选项的含义。下面,我们详细介绍一下这四个选项的含义和作用。 1.encoding encoding 是 Vim 内部使用的字符编码方式。当我们设置了 encoding 之后,Vim 内部所有的 buffer、寄存器、脚本中的字符串等,全都使用这个编码。Vim 在工作的时候,如果编码方式与它的内部编
7、码不一致,它会先把编码转换成内部编码。如果工作用的编码中含有无法转换为内部编码的字符,在这些字符就会丢失。因此,在选择 Vim 的内部编码的时候,一定要使用一种表现能力足够强的编码,以免影响正常工作。 由于 encoding 选项涉及到 Vim 中所有字符的内部表示,因此只能在 Vim 启动的时候设置一次。在 Vim 工作过程中修改encoding 会造成非常多的问题。如果没有特别的理由,请始终将 encoding 设置为 utf-8。为了避免在非 UTF-8 的系统如 Windows 下,菜单和系统提示出现乱码,可同时做这几项设置: set encoding=utf-8 (这个是必须的)
8、 (下面两个可以为备份的) set langmenu=zh_CN.UTF-8 language message zh_CN.UTF-8 2. termencoding termencoding 是 Vim 用于屏幕显示的编码,在显示的时候,Vim 会把内部编码转换为屏幕编码,再用于输出。内部编码中含有无法转换为屏幕编码的字符时,该字符会变成问号,但不会影响对它的编辑操作。如果 termencoding 没有设置,则直接使用encoding 不进行转换。 举个例子,当你在 Windows 下通过 telnet 登录 Linux 工作站时,由于 Windows 的 telnet 是
9、 GBK 编码的,而 Linux 下使用 UTF-8 编码,你在 telnet 下的 Vim 中就会乱码。此时有两种消除乱码的方式:一是把 Vim 的 encoding 改为 gbk,另一种方法是保持 encoding 为 utf-8,把 termencoding 改为 gbk,让 Vim 在显示的时候转码。显然,使用前一种方法时,如果遇到编辑的文件中含有 GBK 无法表示的字符时,这些字符就会丢失。但如果使用后一种方法,虽然由于终端所限,这些字符无法显示,但在编辑过程中这些字符是不会丢失的。 对于图形界面下的 GVim,它的显示不依赖 TERM,因此 termencoding 对于它没有意
10、义。在 GTK2 下的 GVim 中,termencoding 永远是 utf-8,并且不能修改。而 Windows 下的 GVim 则忽略 termencoding 的存在。 3.fileencodings 编码的自动识别是通过设置 fileencodings 实现的,注意是复数形式。fileencodings 是一个用逗号分隔的列表,列表中的每一项是一种编码的名称。当我们打开文件的时候,VIM 按顺序使用 fileencodings 中的编码进行尝试解码,如果成功的话,就使用该编码方式进行解码,并将 fileencoding 设置为这个值,如果失败的话,就继续试验下一个编码。 因
11、此,我们在设置 fileencodings 的时候,一定要把要求严格的、当文件不是这个编码的时候更容易出现解码失败的编码方式放在前面,把宽松的编码方式放在后面。 例如,latin1 是一种非常宽松的编码方式,任何一种编码方式得到的文本,用 latin1 进行解码,都不会发生解码失败——当然,解码得到的结果自然也就是理所当然的“乱码”。因此,如果你把 latin1 放到了 fileencodings 的第一位的话,打开任何中文文件都是乱码也就是理所当然的了。 以下是一个 fileencodings 设置: set fileencodings=ucs-bom,utf-8,cp936,gb18
12、030,big5,euc-jp,euc-kr,latin1 其中,ucs-bom 是一种非常严格的编码,非该编码的文件几乎没有可能被误判为 ucs-bom,因此放在第一位。 utf-8 也相当严格,除了很短的文件外(例如许多人津津乐道的 GBK 编码的“联通”被误判为 UTF-8 编码的经典错误),现实生活中一般文件是几乎不可能被误判的,因此放在第二位。 接下来是 cp936 和 gb18030,这两种编码相对宽松,如果放前面的话,会出现大量误判,所以就让它们靠后一些。cp936 的编码空间比 gb18030 小,所以把 cp936 放在 gb18030 前面。 至于 big5、euc
13、jp 和 euc-kr,它们的严格程度和 cp936 差不多,把它们放在后面,在编辑这些编码的文件的时候必然出现大量误判,但这是 Vim 内置编码探测机制没有办法解决的事。由于中国用户很少有机会编辑这些编码的文件,因此我们还是决定把 cp936 和 gb18030 前提以保证这些编码的识别。 最后就是 latin1 了。它是一种极其宽松的编码,以至于我们不得不把它放在最后一位。不过可惜的是,当你碰到一个真的 latin1 编码的文件时,绝大部分情况下,它没有机会 fall-back 到 latin1,往往在前面的编码中就被误判了。不过,正如前面所说的,中国用户没有太多机会接触这样的文件。
14、 如果编码被误判了,解码后的结果就无法被人类识别,于是我们就说,这个文件乱码了。此时,如果你知道这个文件的正确编码的话,可以在打开文件的时候使用 ++enc=encoding 的方式来打开文件,如: :e ++enc=utf-8 myfile.txt :set fileencoding 即可显示文件编码格式。 遇到一个奇怪的现象,首先我在SecurCRT中,设定我的字符集为UTF-8,然后 通过echo的方式输入: 使用set fileencoding的方式查看可以得到 然后呢我将SecurCRT中的字符集设定为默认,查看效果: 得出结论:首先UTF
15、8是支持中文的,如果是通过UTF-8编码的中文,然后到其它形式的编码查看会乱码 如果你只是想查看其它编码格式的文件或者想解决用Vim查看文件乱码的问题,那么你可以在 (没有验证过) ~/.vimrc 文件中添加以下内容: set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936 这样,就可以让vim自动识别文件编码(可以自动识别UTF-8或者GBK编码的文件),其实就是依照 fileencodings提供的编码列表尝试,如果没有找到合适的编码,就用latin-1(ASCII)编码打开。 文件的转码 1.在vim中直接进
16、行转换文件编码,比如将一个文件转换成utf-8格式 :set fileencoding=utf-8 2.iconv 转换,iconv的命令格式如下: iconv -f encoding -t encoding inputfile 比如将一个UTF-8 编码的文件转换成GBK编码 # iconv -f GBK -t UTF-8 file1 -o file2 3.enconv转换文件编码 # enconv -L zh_CN -x UTF-8 filename 试验: 首先我从我的windows中上传一个文件。应该很清楚的知道windows通常的 中文为gb2312的
17、 在linux查看一下先: 查看文件的字符集:(尽然显示的是latin1。。。不知为何)。 在secureCRT里面查看(因为我设置的字符是utf8,,所以也出现了乱码) 在secureCRT里面改一下:(改成GB2312)。 上图显示是成功的,既然这样的话找到了原因,因为我的data的编码是gb2312,所以我要将其改变显示端改变为gb2312,或者是将文件改为utf-8,以适应显示端的字符 1. 首先我选择更改文件吧(我的vim支持utf-8的查看) 有几种方式: 1):set fileencoding=utf-8 (我试验了,没有效果好像
18、 2)通过# iconv -f GB2312 -t UTF-8 file1 -o file2 在linux中我必须进行转换成utf-8才行。 2. 更改显示器里面的可以查看(这种是醉方便的) 1) 改变我的secureCRT 2) 改变我的vim的显示:(这样也是可以的) 如果觉得麻烦的话,最好就是修改~/.vimrc这样的话,不可能出现乱码的情况了。 文件名编码转换 1.从Linux往 windows拷贝文件或者从windows往Linux拷贝文件,有时会出现中文文件名乱码的情况,出现这种问题的原因是因为,windows的文件名中文编码默认为
19、GBK,而Linux中默认文件名编码为UTF8,由于编码不一致,所以导致了文件名乱码的问题,解决这个问题需要对文件名进行转码。 在Linux中专门提供了一种工具convmv进行文件名编码的转换,可以将文件名从GBK转换成UTF-8编码,或者从UTF-8转换到GBK。 首先看一下你的系统上是否安装了convmv,如果没安装的话用: yum -y install convmv 安装。 下面看一下convmv的具体用法: convmv -f 源编码 -t 新编码 [选项] 文件名 常用参数: -r 递归处理子文件夹 –notest 真正进行操作,请注意在默认情况下是不对文件进行真实操
20、作的,而只是试验。 –list 显示所有支持的编码 –unescap 可以做一下转义,比如把%20变成空格 比如我们有一个utf8编码的文件名,转换成GBK编码,命令如下: # convmv -f UTF-8 -t GBK –notest utf8编码的文件名 这样转换以后”utf8编码的文件名”会被转换成GBK编码(只是文件名编码的转换,文件内容不会发生变化) 2.文件名编码转换: 比如要将一个GBK编码的文件转换成UTF-8编码,操作如下 enconv -L zh_CN -x UTF-8 filename 修改字符集的方法 如果默认语言是en_US.UTF-8,在
21、Linux的字符和图形界面下都是无法显示和输入中文的。如果默认语言是中文,比如zh_CN.GB18030 或者zh_CN.gb2312,字符界面无法显示和输入,图形界面可以。 举个简单的例子吧: 在我的系统默认的语言是: 在我远程操作界面SecureCRT的界面采用的是UTF-8的字符集,这个呢仅仅表示它能够在这个SecureCRT的终端上显示中文,对系统没有影响的。 下面显示的是在SecureCRT的界面下的情况 但是到了我真正的系统里面,默认是en_US.UTF-8字符集,在图形界面下是无法显示和输入中文的。 显示的是一堆的乱码。 1.直接设置变量的方式修改
22、 上面是查看中文字符集的写法。 1).直接设置变量的方式修改,命令如下两条命令: [test@pan ~]$LANG=xxx 或者 export LANG=xxx; [test@pan ~]$LC_ALL=”xxx” 或者 export LC_ALL=”xxx”; 注:xxx为欲修改为的字符集 查看标准的字符集的方法,locale –a命令,常用的有zh_CN.GB2312、 zh_CN.GB18030或者zh_CN.UTF-8、en_US.UTF-8等 但是上述修改方式只会在当前shell中生效。新建shell此环境变量消失 故平时登录系统的执行“LANG= ”
23、这个命令的时候显示的就没有乱码的缘故,意思就是取消了字符集的显示,和开篇提到的是一个意思 2.修改配置文件 直接修改文件,通过修改/etc/sysconfig/i18n文件控制 #locale -a查看系统支持的字符集 一般来说要设置 Linux 系统的环境变量只需要在 /etc/profile (全局) 或者 ~/.bashrc (单个用户) 即可。但是对于 LANG 变量来说,有时候你即使在所有这些初始化脚本里面 export 过了,LANG 的值还是纹丝不动 。实际上,需要去修改 /etc/sysconfig/i18n 文件里面的内容。 $vi /etc/sysc
24、onfig/i18n文件控制 LANG="zh_CN.GB18030" #==>此处即为系统的语言 SUPPORTED="zh_CN.UTF-8:zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en" SYSFONT="lat0-sun16" 修改文件保存退出之后要生效要执行如下命令才可生效 注释:【I18N 是 internationalization 的缩写形式,意即在 i 和 n 之间有 18 个字母,本意是指软件的“国际化”. I18N支持多种语言,但是同一时间只能是英文和一种选定的语言,例如英文+中文、英文+德文、英文+韩文等等
25、 原来的: LANG="zh_CN.UTF-8" SUPPORTED="zh_CN.UTF-8:zh_CN:zh" SYSFONT="latarcyrheb-sun16"】 $source /etc/sysconfig/i18n 注释:【用户登陆shell的时候会读取其中的设定的值的。 加一点对source命令的了解: source命令也称为“点命令”,也就是一个点符号(.)。source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。 用法: #source filename或 .filename 还有一个用处是把很多的命令做成一个
26、文件,让它自动顺序执行,对于需要多次反复编译系统核心的用户来说会很方便,而用source命令就可以做到这一点,它的作用就是把一个文件的内容当成shell来执行。 比如建一个文件:make_command,在其中输入很多的命令,然后使用source命令 #source make_command执行就行了。】 修改个人的字符界面: #cp /etc/sysconfig/i18n $HOME/.i18n LANG="en_US.UTF-8" SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en" SYSFONT="latarcy
27、rheb-sun16" LC_ALL="en_US.UTF-8" export LC_ALL 注释:【关于LC_ALL】的解释 在Linux中通过locale来设置程序运行的不同语言环境,locale由ANSI C提供支持。locale的命名规则为<语言>_<地区>.<字符集编码>,如zh_CN.UTF-8,zh代表中文,CN代表大陆地区,UTF-8表示字符集。在locale环境中,有一组变量,代表国际化环境中的不同设置。 1. LC_COLLATE 定义该环境的排序和比较规则 2. LC_CTYPE 用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编
28、码,字符是单字节还是多字节,如何打印等。是最重要的一个环境变量。 3. LC_MONETARY 货币格式 4. LC_NUMERIC 非货币的数字显示格式 5. LC_TIME 时间和日期格式 6. LC_MESSAGES 提示信息的语言。另外还有一个LANGUAGE参数,它与LC_MESSAGES相似,但如果该参数一旦设置,则LC_MESSAGES参数就会失效。LANGUAGE参数可同时设置多种语言信息,如 LANGUANE=”zh_CN.GB18030:zh_CN.GB2312:zh_CN”。 7. LANG LC_*的默认值,是最低级别
29、的设置,如果LC_*没有设置,则使用该值。类似于 LC_ALL。 8. LC_ALL 它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响。 或者是修改登录用户的.bash_profile文件中加入 export LANG=zh_CN.GB18030 export LANGUAGE=zh_CN.GB18030:zh_CN.GB2312:zh_CN 一个由英文字符系统到中文字符系统的转变实例 环境是这样的: 修改: 使他生效就行了。 就行了。 涉及到字符集的一些问题 1、字符界面下无法识别输入中文
30、 你肯定知道安装zhcon就可以解决这个问题,但是安装完了以后那些命令,你知道如何输入吗?如果直接输入zhcon后,你会发现系统识别不了以前的中文的文件名和内容,而此时如果你新建一个中文的文件或者输入中文的内容,在桌面系统下也识别不了。 注释:zhcon是中文支持的软件,zhcon目前支持GB2312,GBK,BIG5,JIS,KSCM等多种内码。在系统运行时可以通过热键CTRL-F1到CTRL-F5在以上几种编码方式间自由切换。 2、浏览网页时,出现了乱码 3、你用过FTP吗,你在桌面系统下将中文文件放到FTP的文件夹下,你发现别人访问你的FTP时,里面全是乱码 其实上面两个问
31、题都是关于字符集的问题,它们的字符集不同 1、 windows、linux桌面系统下,默认的中文字符集是UTF8,而浏览器、zhcon默认的字符集是GB2312,所以它们互相识别不了。如果你在浏览器里面的“查看”,选择UTF8编码,就可以识别这些了.当然zhcon也是这样,如果你输入zhcon --utf8 就不会遇到上面的问题了。 上面是查看浏览器的编码,360的编码,首先是查看在网站的空白页直接点击右键,然后查看编码就行了。它的编码是自动检测的,当遇到英文名的就直接会跳到Unicode(UTF-8)的字符界面了。浏览器的字符会自动的选择的,所以基本上不会出现什么错误。 2、现
32、在就说说到底字符集都有哪些 windows、linux默认的中文字符集是UTF8(它是Unicode的一部分,适用于中日韩文),我们国内的有(从字符集大小排)依次有GB2312->GB18030->GBK,简单介绍如下 GB2312=ASCII+扩展的ASCII字符+常用汉字 GB18030=GB2312+特殊字符 GBK=GB18030+所有其它字符(这个不太了解了) 当然这三个字符集后者是兼容前者的,可以互相识别,但是UTF8与它们就不认识了。 我们国内的一些软件用的基本都是GB2312, 转换文件中的字符集 字符转换使用 iconv命令,用法如下:iconv -f
33、GBK -t GB2312 -o i.txt h.txt # 把文件 h.txt 从 GBK 编码格式转换为 GB2312 编码格式,并保存为 i.txt 工作场景中使用的脚本,为避免中文乱码,有时候也会在脚本里更改字符集: #!/bin/sh export LANG="ZH_CN.GB18030" (脚本内容) SSH工具(SecureCRT)要与linux的字符集保持一致。 在SecureCRT的“会话选项”对话框,“终端”→“外观”类里,“字符编码”中的选项要和linux保持一致。 linux使用的字符集为“ZH_CN.GB18030”,SecureCRT的选项
34、里设置为“默认”即可。 服务端和客户端字符集对应,乱码就可以有效避免。 中文字符集:ZN_CN.GB18030 字符集变量:LANG 字符集配置文件:/etc/sysconfig/i18n echo命令(单行文本的追加) source与.(修改后的变量生效) export命令(设置环境变量) 通常大多数的使用者为了获得完善的中文显示效果,以及为了保持和windows的兼容性(主要是指已挂在的Windows分区的正确显示),通常会选择gb2312或者gb18030为系统默认字符。但是,使用Unicode编码是当前计算机操作系统的趋势。作为一个计算机的多位字符表示系统,
35、Unicode 支持世界上所有语言的编码和转换。所以呢如果使用中文的Linux使用者以Unicode(UTF-8)作为系统的默认字符集。 在Vim中可以直接查看文件编码 :set fileencoding 即可显示文件编码格式。 如果你只是想查看其它编码格式的文件或者想解决用Vim查看文件乱码的问题,那么你可以在 ~/.vimrc 文件中添加以下内容: set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936 这样,就可以让vim自动识别文件编码(可以自动识别UTF-8或者GBK编码的文件),其实就是依照 fileenc
36、odings提供的编码列表尝试,如果没有找到合适的编码,就用latin-1(ASCII)编码打开。 Apache中的乱码问题 1. 首先是查看网页本身的编码,查看它的html文档的编码 查看百度的源代码。 从上图可以看到百度的html的源代码是用utf-8编写的。而浏览器会默认使用UTF-8的方式进行访问的,所以不会出现乱码的问题。 那么看一下apache中的配置文件。 它默认的配置文件是UTF-8的。 如果出现这种情况: 可以在apache的配置文件中将 AddDefaultCharset UTF-8 改为 AddDefaultCharset
37、 GB2312 或者是AddDefaultCharset GBK 将 UTF-8改为GBK/GB2312 确实可以让中文正常显示,但是UTF-8编码的文件又会乱码。 将AddDefaultCharset 设置为 OFF ,重启httpd服务,就可以按照网页源代码中声明的编码格式显示了。 1. Adddefault Charset GB2312 2. Adddefault Charset off 【注释:这种方式关掉了服务器的默认语言的发送,这样仅凭html文件头中设置的语言来决定网页语言。】 2. # Adddefualt Charset ISO... 【将Ad
38、dDefautlCharset ISO-8859-1这个前面加上#符号就行了】 3. 在网页中添加 要求浏览器以utf-8编码方式来查看页面,但有一点需要注意,可能Apache的字符集为非UTF-8,例如GB2312,此时浏览器会优先以服务器(GB2312)的字符集编码打开,又可能导致乱码;所以一般可以这么处理:关闭服务器Apache的字符集AddDefaultCharset off 此时浏览会以页面Head中字符集打开; 【注释:META,网页Html语言
39、里Head区重要标签之一HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正确和精确地显示网页内容。常用的HTTP- EQUIV类型有: 1、Content-Type和Content-Language (显示字符集的设定) 说明:设定页面使用的字符集,用以说明主页制作所使用的文字以及语言,浏览器会根据此来调用相应的字符集显示page的内容。 该META标签定义了HTML页面所使用的字符集为GB2132,就是国标汉字码。如果将其中的“charset=GB2312”替换成“BIG5”,则该页面所用的字符集就是繁体中文Big5码。当你 浏览一些国外的站点时,
40、IE浏览器会提示你要正确显示该页面需要下载xx语支持。这个功能就是通过读取HTML页面META标签的Content-Type属性而得知需要使用哪种字符集显示该页面的。如果系统里没有装相应的字符集,则IE就提示下载。其他的语言也对应不同的charset,比如日文的字符集是“iso-2022-jp ”,韩文的是“ks_c_5601”。】 清空浏览器中的Cache试一试。 网上有一种解决方案: 最近几天再做平台迁移,同样的系统配置,只是把程序移到稍好的服务器上。问题出来了,所有web页面上的中文都是乱码,我勒个去的。搞了一夜,终于搞定。 中间走了很多弯路,网上都说,修改http.conf中参
41、数,在再web头部添加指定字符集编码,妈呀,这个工程大多了,我网站是生成静态页面的。 可以看htaccess文件配置文档,发现Apache Module mod_autoindex (http://http.apache.org/docs/2.2/mod/mod_autoindex.html#indexoptions),里面有FancyIndexing项目。 经过分析,应该是由于默认的目录浏览方式是由Apache生成index文件的,因为只能在生成前设定编码。最后查看apache 官方文档,发现Apache Module mod_autoindex 模块。这里面有字符集的设置方法,In
42、dexOptions竟然也有一个关于编码的设置,Charset=character-set 。看到这里,蛋疼的一比。 到这里,问题就好解决了,用浏览器打开网站(还是乱码)--> 右键(编码设置)一个一个试字符集,到我试到GB2312时,开心呐,乱码消失;修改httpd.conf把这句前面注释干掉Include conf/extra/httpd-autoindex.conf ; 在httpd-autoindex.conf 加入 IndexOptions Charset=GB2312 重启apache ,一切正常。。。。。。。 Mysql乱码的问题 主要是有下面几种问题: 1
43、server本身设定问题,例如还停留在latin1 2.table的语系设定问题(包含character与collation) 3.客户端程式(例如php)的连线语系设定问题 强烈建议使用utf8!!!!utf8可以兼容世界上所有字符!!!! 一. 避免创建数据库及表出现中文乱码和查看编码方法 1、创建数据库的时候:CREATE DATABASE `test` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'; 2、建表的时候 CREATE TABLE `database_user` ( `ID` varchar(40) NO
44、T NULL default '', `UserID` varchar(40) NOT NULL default '', ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 这3个设置好了,基本就不会出问题了,即建库和建表时都使用相同的编码格式。 查询建立的库和表: Mysql>show variables like “%char%” +--------------------------+---------------+ | Variable_name | Value | +--------------------------+-------
45、 | character_set_client | gbk | | character_set_connection | gbk | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | gbk | | character_set_server | utf8 | | character_set_system | utf8 | +--------------------------+-------------+ 注:以前
46、2个来确定,可以使用set names utf8,set names gbk设置默认的编码格式; 执行SET NAMES utf8的效果等同于同时设定如下: SET character_set_client='utf8'; SET character_set_connection='utf8'; SET character_set_results='utf8'; PHP一般都与Mysql数据库交互,两者进行数据通信时,也有一个编码问题,不管增还是查,必须指定通信编码方式(一般与Head中编码方式UTF-8一致,否则取出来的数据是以非UTF-8编码的,到页面上显示仍旧为乱码;把
47、UTF-8编码的字符通过非UTF-8的通信方式传输到数据库同样会失败,我遇到了这个Insert失败问题,希望大家不要重蹈覆辙,O(∩_∩)O~) 指定通信方式方法:mysql_query('set names utf8'),注意不是utf-8; 4. 查看test数据库的编码格式: Mysql>show create database test; 查看yjdb数据库的编码格式: Mysql>show create table yjdb; 二、避免导入数据库中有中文乱码的问题 1:将数据编码格式保存为utf-8 设置默认编码为utf8: set names
48、utf8; 设置数据库db_name默认为utf8: ALTER DATABASE `db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 设置表tb_name默认编码为utf8: ALTER TABLE `tb_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 导入: LOAD DATA LOCAL INFILE 'C:\\utf8.txt' INTO TABLE yjdb; 2.将数据编码格式保存为ansi(即GBK或GB2312) 设置
49、默认编码为gbk: set names gbk; 设置数据库db_name默认编码为gbk: ALTER DATABASE `db_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; 设置表tb_name默认编码为gbk: ALTER TABLE `tb_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; 导入: LOAD DATA LOCAL INFILE 'C:\\gbk.txt' INTO TABLE yjdb; 注:1.UTF8不要导入gbk,gbk不要导入UTF8 二. 解决网页中的乱码问题 将网站编码设为 utf-8,这样可以兼容世界上所有字符。 如果网站已经运作了好久,已有很多旧数据,不能再更改简体中文的设定,那么建议将页面的编码设为 GBK, GBK与GB2312的区别就在于:GBK能比GB2312显示更多的字符,要显示简体码的繁体字,就只能用GBK。 1.编辑/etc/f ,在[mysql]段加入default_character_set=utf8; 2.在编写Connection URL时,加上?useUnicode=true&characterEncoding=utf-8参; 3.在网页代码中加上
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818