69,382
社区成员
发帖
与我相关
我的任务
分享
# include <locale.h>
# include <wchar.h>
# include <wctype.h>
# if defined (PWINDOWS)
# define LOCSTR ".936"
# elif defined (PLINUX)
# define LOCSTR "zh_CN.UTF-8"
# else
# define LOCSTR "C"
# endif // defined
int main (void)
{
setlocale (LC_ALL, LOCSTR);
for (int x = 0; x < 2; x ++) wprintf (L"中国\n");
return 0;
}
宽字符的编码方案和具体使用的是哪个国家的语言文字无关,但是程序的执行和宽字符的具体操作就不能不考虑这些因素。特别是,如果需要一个从宽字符到多字节字符的转换(在本程序中,wprintf函数就执行这种转换),则必须指定多字节字符集(代码页)。为此,程序中就需要调用setlocale函数来设置和区域有关的参数,很多宽字符处理函数的执行都会受这些参数的影响。以下是该函数的原型:
# include <locale.h>
char * setlocale (int category, const char * locale);
该函数的第一个参数用于指定和区域有关的项,LC_ALL表示整个区域的所有项;第二个参数是字符串,其内容取决于C实现,用于选取同第一个参数相对应的值。对于Windows简体中文版的控制台来说,它的活动代码页是936,实际上对应于GBK字符集,所以这个字符串可以是“.936”,但也可以使用“chs”或者“chinese”;对于Linux控制台来说,它使用的是Unicode字符集,采用UTF-8编码方案,因此这个字符串可以是“zh_CN.UTF-8”。
为了使当前程序能够在Windows和Linux上编译,同时又不用修改源程序,这里使用了预处理指令(条件编译指令)。如果已经定义了宏PWINDOWS,则将宏LOCSTR定义为字符串“.936”,如果已经定义了宏PLINUX,则将宏LOCSTR定义为字符串“zh_CN.UTF-8”,如果PWINDOWS和PLINUX都未定义,则将宏LOCSTR定义为字符串“C”,它对应着每个程序启动之后的最小环境。GCC允许使用编译选项-D来预定义一个可以在编译期间使用的宏,因此,假定上述程序的源文件是exam.c,则可以在Linux上用下面的方法转换它:
gcc exam.c –fwide-exec-charset=UTF-32LE –DPLINUX
相对应地,如果是在Windows上,可以使用下面的方法:
gcc exam.c –fwide-exec-charset=UTF-16LE –DPWINDOWS
#include <stdio.h>
void main(void)
{
int i = 0;
for (i=0; i<1; i++)
{
printf("中国\n");
}
}