2008-03-09

Unix服务器下Web应用开发所不能够承受之痛:中文乱码问题!

Posted in Java, PHP, FreeBSD/Unix服务器 at 19:34 Author:仲远

标签:

本文可以自由转载,转载时请保留全文并注明出处。作者:仲子
原文链接:http://www.wangzhongyuan.com/archives/311.html

相信中文应用程序的人,尤其是网站建设者以及Unix服务器或Linux的使用者,常常都会遇到一个非常头疼的问题:中文乱码问题。虽然现在越来越多的编程语言支持国际化,提供很多的语言包或者字符集供程序员选择(例如Java),但是我们仍然常常会为莫名其妙而出现的中文乱码而头疼。甚至有时候,我们不得不面临着使用Unix服务器的一个尴尬:一次小小的重启可能引发一场“惊天血案”。

虽然有经验的框架构建师或者编程人员能够比较轻易地解决中文字符集导致的乱码问题,但是我相信仍然有许多人为此而苦苦挣扎。常常一个很小的配置没有设置好,或者一些莫名其妙的原因,就会导致乱码的产生。尤其gb2312以及utf-8的同时存在,让人在处理中文存储以及字符集转换时大费周章。

以下记录几次我所遇到的乱码问题以及解决办法:
1、登录Unix服务器(Freebsd)后用户的默认语言不是中文,或者默认字符集不是GB2312。
解决办法:在用户根目录文件夹(例如/home/wangzhongyuan)下编辑.bashrc,加入如下语句:export LANG=zh_CN.GB2312。然后退出,再重新登录。使用命令date看看是不是显示中文了:)

2、使用crontab运行一些程序,例如java时,发现无法处理中文,或者出现中文乱码问题。
产生原因:这是因为Unix/Linux下使用crontab是的运行环境以及不是用户环境了,因此原本用户下的一些环境变量的设置就失效了。例如原来用户环境变量设置的是GB2312,但是使用crontab运行时的环境变量就可能是ISO8859-1。
解决办法:使用.sh等shell脚本来执行程序的时候,将用户配置引入。例如:
#! /usr/local/bin/bash
. /home/wangzhongyuan/.profile
……
注意,在/home/wangzhongyuan/.profile前面有一个点和空格。

3、在php中使用exec/system调用系统命令或执行某个java程序的时候,出现中文乱码问题
产生原因:这个乱码产生的原因和crontab中产生乱码的原因是一样的,那就是php调用exec或者system的时候,执行环境有可能与用户环境不同。不过最让我郁闷的是,这个问题最开始没有出现,也就是一开始直接使用exec或system的时候,没有乱码,一切都是正常的,但是某次重启服务器以后,就突然出现了。查了好久才发现是这个问题。
解决办法:自然是想方设法设置好我们想要的环境变量喽。可以在exec或者system中要执行的命令前加上编码设置,也就是如下形式:“export LC_ALL=zh_CN.GB2312 && export LANG=zh_CN.GB2312 && 要执行的命令”。
注意,我尝试过,如果将这个命令分成几个exec来分别执行,是没有办法保存住这个环境变量的设置的。

本文可以自由转载,转载时请保留全文并注明出处。作者:仲子
原文链接:http://www.wangzhongyuan.com/archives/311.html

本文可以自由转载,转载时请保留全文并注明出处:
转载自仲子说 [ http://www.wangzhongyuan.com/ ]
原文链接:

1 Comment »

  1. 西西 said,

    2008年March9日 at 21:41

    越来越看不懂了,越来越模糊。
    也许就未曾理解,也许就未曾看清。

Leave a Comment

*
To prove you're a person (not a spam script), type the security text shown in the picture. Click here to regenerate some new text.
Click to hear an audio file of the anti-spam word