subversion也需要设置“set LANG=en_US”

在服务器上下载了一个svn(zip格式,解压就可以的),原本是想利用svn作为中转/记录,实现网站远程上传和更新,但是解压之后,运行命令行命令svn.exe,却遇到了像下面这样的乱码:

D:\server\svn\bin>svn ?\232?\175?\183?\228?\189?\191?\231?\148?\168?\226?\128?\156svn help?\226?\128?\ 157?\228?\187?\165?\229?\190?\151?\229?\136?\176?\231?\148?\168?\230?\179?\149?\ 229?\146?\140?\229?\184?\174?\229?\138?\169?\227?\128?\130

这实在是让我纳闷了半天,按理说svn解压缩就行,连install脚本、程序都没有,怎么一运行就乱码呢?并且敲几个其他的svn命令观察,发现乱码还不一样,应该是svn正常的执行了,而输出内容不正常而已。

同样也是偶然的,发现了解决方法。记得在Sybase Open Client 和 GTK+有点小冲突,当时问题出在了环境变量LANG上,这个svn原来也使用了这个环境变量,当环境变量LANG设置为en_US以后,svn的输出信息就正常了。

C:\>set lang=en_us C:\>svn Type ‘svn help’ for usage.

现在把这个LANG设置到windows系统变量中,问题就解决了。

Update @ 2008-04-16

近日在用php实现svn的hooks脚本时发现,虽然使用的系统ubuntu的语言是en_US.UTF-8,但在php中仍然要将LANG设置为en_US才行(LANG设置为en_US.UTF-8就画蛇添足了),不过直接在php中更改环境变量是不行的:

putenv('LANG="en_US"'); 

这样只会影响php的环境,而php调用shell_exec()的时候,传递给命令的还是sh的默认环境,所以要在每次调用的时候强制指定环境变量。除了LANG以外,还要将LC_ALL赋值为en_US.UTF-8,这样才完全没有乱码,完整的结果如下:

$svn_log = shell_exec("env LANG=en_US LC_ALL=en_US.UTF-8 svnlook log $repos -r $rev");

参考:subversion的svn命令行显示乱码的解决