去年发表了 Mono 开发指南 的系列文章后,我基本没再写关于 Mono 方面的东西,主要近两年做 Java 方面的平台 ,较少采用 dotnet 方面的东西。还有一个问题,就是 Mono 的中文问题,使我很少花时间在它的上面。
以前使用 Mono 时,你看我以前的文章的举例,我都极力回避中文问题,所写的 cs 文件里面没有一个汉字。这是因为以前的 Mono 国际化方面实在是太弱了。也有很多朋友发 email 给我,询问我关于中文如何处理,我当时也不知怎么解决,在 Mono 的 bugzilla 中提交了一个 bug ,迟迟未见 closed ,所以没有给这些朋友回信,在次说声 soory 。
现在, Mono 能够较好的处理国际化的问题,我在此也把我的研究心得发布在这里,希望能和热爱 Mono 、热爱 dotnet 的朋友们一起分享、一起探讨。
首先说一下我的环境: asus + fedora 3 + Mono 1.1 。
Locale 设置全部为 zh_CN.gb2312 。
在这篇文章中,我先来介绍一下如何处理以前困扰大家的中文问题。下一篇文章我将介绍程序的国际化。
使用 monodevlop 建立一个 Console 工程 , 名称为 Test 。
编辑 Main.cs 文件:
using System;
class MainClass
{
public static void Main (string[] args)
{
Console.WriteLine(" 兄弟的 email 地址为 :[email protected]");
}
}
在 monodevelop 中运行,在输出窗口会显示正确的结果。
打开终端,进入到 ./bin/Debug 目录下,运行 mono Test.exe ,显示 乱码 。这和我的环境设置有关,将终端的编码设置为 utf8 ,再运行 mono Test.exe ,结果显示 正常 。
以上编译是通过 monodevelop 编译的,下面手工编译一下,试试效果。
进入 Main.cs 所在的文件夹:
mcs Main.cs
执行上述命令后将生成 Main.exe 文件,运行这个文件。
mono Main.exe
输出结果为 乱码 (无论终端编码是 gb2312 还是 utf8 )。
通过设置代码页进行编译:
mcs –codepage:utf8 Main.cs
执行上述命令后将生成 Main.exe 文件,运行这个文件。
mono Main.exe
输出结果为 正常 (终端编码是 utf8 )。
** 小技巧 ** :
每次运行 mono 编译得程序都必须使用 mono *.exe ,比较麻烦,我们页可以在 Linux 下创建文件关联。
执行下面得 shell 就不必每次都运行 mono 文件了。
if [ ! -e /proc/sys/fs/binfmt_misc/register ]; then
/sbin/modprobe binfmt_misc mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
fi
if [ -e /proc/sys/fs/binfmt_misc/register ]; then
echo ':CLR:M::MZ::/usr/bin/mono:' > /proc/sys/fs/binfmt_misc/register
else
echo "No binfmt_misc support" exit 1
fi