区域表示--Locale的概念的详细介绍

区域表示--Locale的概念的详细介绍

Locale 是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory)和字符集(Codeset). 其格式为: 语言[_地域[.字符集]]. 如对中文GBK字符集, locale的格式是:zh_CN.GBK.

Locale 包含了以下分类:

  1. LC_COLLATE, 用于比较和排序. 排序对中文来说也比较重要, 但是现在的 glibc中的locale对中文支持有些问题. 汉字排序的 的方式有许多种, 按照 发音(汉语拼音)或者汉字笔画来排序 是比较容易被接受的.
  2. LC_CTYPE, 用于字符分类
  3. LC_MONETORY, 用于货币单位
  4. LC_NUMERIC, 用于数字显示格式. 下面是不同国家的在货币符号 和数字格 式上的不同:
    • 中国大陆: 1,234.56RMB
    • 美国: $1,234.56
    • 德国: 1.234,56DM
  5. LC_TIME, 用于时间和日期. 时间可以用12小时或者24小时的 格式来计算. 在小时和分钟之间可以用逗点或者冒号隔开. 下面 是一些Locale设置的时 间和日期的格式:
    • 中国: 14点20分 2000年三月十四号
    • 英国: 02:20pm 14/03/2000
    • 美国: 02:20pm 03/14/2000
    • 芬兰: 14.20 14.03.2000
  6. LC_MESSAGES, 用于国际化信息, 主要是提示信息,错误信息, 状态信息, 标 题, 标签, 按钮和菜单等.

Locale 通过ANSI C 函数setlocale(分类, locale)来初始化locale 数据. 当locale设置为空时, locale的值便从系统的环境变量中取得. 为了 方便应用 软件, 设置所有的分类, 可以采用下述方式:

setlocale(LC_ALL, "");

如果不成功, 该函数返回NULL. 函数应该回落到setlocale(LC_ALL,"C").

我们可以比较一下:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main()
{
char s[]="宾馆", i;
wchar_t ws[10]= L"";
puts(s);
for(i=0; i<strlen(s); i++)
printf("%02x/t", s[i]&0xff);
printf("strlen(s) == %d./n/n", strlen(s));

setlocale(LC_ALL, "chs"); /*!!!!!!!!!!*/
mbstowcs(ws, s, strlen(s));
fputws(ws, stdout);
printf("/n");
for(i=0; i<wcslen(ws); i++)
printf("%02x/t", ws[i]);
printf("wcslen(ws) == %d./n/n", wcslen(ws));

system("PAUSE");
return 0;
}

!注释的语句,如果去掉这个语句,那么可以看到输出的编码 和 有这个 setlocale 的时候,编码是不一样,其区别就在于所使用的区域表示的差别。