setlocale utf8函数怎么用

简介/Setlocale
配置地域化信息函数#include char *setlocale (int category, const char * locale);
描述/Setlocale
null函数种类: 操作系统与环境内容说明:本函数用来配置地域的信息,设置当前程序使用的本地化信息。参数 category 有下列的选择:LC_ALL 包括下面的全部选项都要。 LC_COLLATE 配置字符串比较,PHP 目前尚未实作出来本项。 LC_CTYPE 配置字符类别及转换。例如全变大写 strtoupper()。 LC_MONETARY 配置金融货币,PHP 目前尚未实作。 LC_NUMERIC 配置小数点后的位数。 LC_TIME 配置时间日期格式,与 strftime() 合用。 而参数 locale 若是空字符串 "",则会使用系统环境变量的 locale 。若 locale 为零(NULL),则不会改变地域化配置,返回当前的地域值,若系统尚未实作则返回 false。Locales contain information on how to interpret and perform certain input/output and transformation operations taking into consideration location and language specific settings.Most running environments have certain locale information set according to the user preferences or localization. But, independently of this system locale, on start, all C programs have the "C" locale set, which is a rather neutral locale with minimal locale information that allows the result of programs to be predictable. In order to use the default locale set in the environment, this function can be called with "" as the localeparameter.The locale set on start is the same as setlocale(LC_ALL,"C") would set.The entire default locale can be set by calling setlocale(LC_ALL,"");C程序开始的时候的设置和 setlocale(LC_ALL,"C")相同使用系统默认的设置调用setlocale(LC_ALL,"");The parts of the current locale affected by a call to this function are specified by parameter category.若想显示中文"我爱你",则要包含#include
加一下代码:wchar_t s[]={ 2 ,20320 ,0};setlocale( LC_ALL, "" );printf("%ls",s);//注意是ls
返回值/Setlocale
成功:返回相应设置的地域化信息。字符串可能分配在静态存储区。失败:返回NULL
&|&相关影像
互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于。
登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和专业认证智愿者沟通。
此词条还可添加&
编辑次数:5次
参与编辑人数:5位
最近更新时间: 04:05:15
认领可获得以下专属权利:
贡献光荣榜这两个函数都是linux实现i18n需要用到的。其中setlocale用来设定locale,比如LC_ALL,LC_CTYPE等,一般用法是:setlocale(LC_ALL, "")这用来设置LC_ALL,第二个参数是一个空字符串表示使用环境变量中定义的LC_ALL的值。然后就是用bindtextdomain,比如:bindtextdomain("libgammu", LOCALE_PATH);Linux
i18n中,每个资源文件是.mo文件,这个文件是二进制的,用工具针对一个文本生成(作成二进制应该是考虑了性能)。所以,上面的代码 中,LOCALE_PATH指定的就是寻找mo文件的一个路径,一般的,如果调用了上面的代码,那么gettext
library就会在这个地方寻找mo文件:/usr/share/locale-langpack/&locale&/LC_MESSAGES/libgammu.mo此 外,还有textdomain函数,比如:textdomain("gammu");
这个函数的作用是设置当前需要使用的text
domain(这些text domain之前都要使用bindtextdomain来设定好以便能让gettext
library找到那个mo文件)。如果我们的程序用到了多个mo文件,那就需要bindtextdomain多次,然后用textdomain来指定当 前需要使用哪个。比如gammu中,gammu命令行程序使用的就是gammu这个text
domain,libgammu这个库使用的就是libgammu.mo附上gammu中使用这两个函数的代码:Code: #ifdef GETTEXTLIBS_FOUNDvoid GSM_InitLocales(const char *path) {& &/* setlocale, locale is "" means all locale settings are& && &depend on the environment setting. */& &setlocale(LC_ALL, "");& &if (path == NULL || strlen(path) == 0) {#if defined(LOCALE_PATH)& && &bindtextdomain("libgammu", LOCALE_PATH);#else& && &bindtextdomain("libgammu", ".");#endif& &} else {& && &/* bindtextdomain, libgammu is the catalog, path is the& && && &message file root path. E.g: if path is /usr/share/locale-langpack,& && && &then all messages represented by gettext will by found in:& && && &/usr/share/locale-langpack/&locale&/LC_MESSAGES/libgammu.mo& && && &Refer to manual of bindtextdomain for more details. */& && &bindtextdomain("libgammu", path);& &}}#elsevoid GSM_InitLocales(const char UNUSED *path) {& &setlocale(LC_ALL, "");}#endif
阅读(...) 评论()Lua os.setlocale() - 简书
Lua os.setlocale()
今天来看一个比较神秘的函数,这个函数用起来让人很迷糊,虽然用了半天却搞不懂他是干嘛的,说实话,研究这个函数也花了我不少的时间,期间走了不少弯路,尝试了不同的方法,从源码到出处查了好多资料,接下来我决定用通俗的语言来解释一下这个函数。
这个函数其实就是满足不同人的习惯的,为什么这么说呢?我来举一个例子,假设C语言里有一个打印手机号的标准函数printPhoneNumber(const char* phonenum)(我杜撰的,嘿嘿),那么为了看起来更方便,可能会加一些分割符,我们知道不同的人读手机号的习惯不同,可能是是XXX-XXXX-XXXX,或者是XXXX-XXXX-XXX,还可能是XXX-XXX-XXXXX,再次假设有三个地区A、B、C,每个地区的人按一种读法来读手机号,那么为了编程方便也为了人们读起来更方便,在调用printPhoneNumber(const char* phonenum)之前,调用os.setlocale()来设置区域就可以按当地的习惯来显示手机号了,比如设置成区域A,打印手机号就会按XXX-XXX-XXXXX显示,是不是很方便?其实os.setlocale()并不是用来控制手机号显示的,而是用来控制一些和人们息息相关的一些事情,比如日期显示格式,这个不同的国家不一样吧,还有货币显示,字符比较等等。
os.setlocale()
原型:os.setlocale (locale [, category])
解释:设置程序的当前区域,函数返回设置以后该项最新的值,如果失败则返回nil。
参数:两个参数均可省略,但具体含义不同。
locale:表示一个指定当前设置区域的字串,有几种特殊形式如下
"":一个空字串,当前设置被视为本地设置
"C":当前设置被视为标准C设置
nil:返回category指示设置名的当前值
category:一个描述要更改的设置名,实际上就是制定一个分类的名字,分类如下
all:默认选项,包含下述所用分类。
collate :影响C语言函数strcoll和strxfrm
ctype:影响字符处理函数和多行字符处理函数
monetary:影响C语言函数localeconv返回的货币格式化信息
numeric:影响格式化输入输出字符中的小数点符号
time:影响C语言函数strftime
首先我们来新建一个文件,文件命名为setlocaletest.lua然后编写如下代码:
-- 首先查询一下初始的区域设置
print(os.setlocale(nil))
-- 设置成中文简体区域
print(os.setlocale("chs"))
-- 其实这两个是无效的,就看看返回值
print(os.setlocale("En-Us"))
print(os.setlocale("zh_CN"))
-- 设置成英文区域
print(os.setlocale("eng"))
-- 设置成中文繁体区域
print(os.setlocale("cht"))
-- 现在只将数字部分设置成中文简体区域
print(os.setlocale("chs","numeric"))
-- 打印一下时间
-- 实际上现在的时间部分还是中文繁体区域
print(os.setlocale(nil,"time").."'s time format as follow:")
print(os.date("%c").."\n")
-- 现在将时间部分设置成英文区域
print(os.setlocale("eng","time"))
-- 再打印时间对比一下
print(os.setlocale(nil,"time").."'s time format as follow:")
print(os.date("%c").."\n")
-- 最后看一下当前的区域设置
print(os.setlocale(nil))
setlocale.png
首先来看一些结果中的第一行“C”,表明现在的区域设置是“C”,原因是当C语言程序初始化时(刚进入到 main() 时),locale 被初始化为默认的 C locale,其采用的字符编码是所有本地 ANSI 字符集编码的公共部分,是用来书写C语言源程序的最小字符集(所以才起locale名叫:C)。
由结果的3、4行来看当设置的区域错误时,会返回nil,到底可以设置哪些区域呢,下边我来列举常用的一部分:
法文(标准)
加拿大法文
巴西葡萄牙文
由两次显示时间格式的不同可以体现os.setlocale() 的作用,在中文繁体区域下时间有上午和下午的区分,但是在英文区域下就没有了,而转化为了24小时的表现方法。
当参数locale为一个空字串,当前设置被视为本地设置,比如我在运行时就会被设置成中文简体。
最后我们在查询设置情况时发现,不同的分类被设置成了不同的区域,这也是符合条件的。
还有一点,这个函数os.setlocale() 由于依赖了C语言函数setlocale是线程不安全的,使用时要注意这一点。
用诗词陶冶情操,用代码改变生活。C 库函数 - setlocale()
C 库函数 char *setlocale(int category, const char *locale) 设置或读取地域化信息。
下面是 setlocale() 函数的声明。
char *setlocale(int category, const char *locale)
category -- 这是一个已命名的常量,指定了受区域设置影响的函数类别。
LC_ALL 包括下面的所有选项。
LC_COLLATE 字符串比较。参见 strcoll()。
LC_CTYPE 字符分类和转换。例如 strtoupper()。
LC_MONETARY 货币格式,针对 localeconv()。
LC_NUMERIC 小数点分隔符,针对 localeconv()。
日期和时间格式,针对 strftime()。
LC_MESSAGES
系统响应。
locale -- 如果 locale 是 NULL 或空字符串 "",则区域名称将根据环境变量值来设置,其名称与上述的类别名称相同。
如果成功调用 setlocale(),则返回一个对应于区域设置的不透明的字符串。如果请求无效,则返回值是 NULL。
下面的实例演示了 setlocale() 函数的用法。
#include &locale.h&
#include &stdio.h&
#include &time.h&
int main ()
struct tm *
char buffer[80];
time( &currtime );
timer = localtime( &currtime );
printf("Locale is: %s\n", setlocale(LC_ALL, "en_GB"));
strftime(buffer,80,"%c", timer );
printf("Date is: %s\n", buffer);
printf("Locale is: %s\n", setlocale(LC_ALL, "de_DE"));
strftime(buffer,80,"%c", timer );
printf("Date is: %s\n", buffer);
return(0);
让我们编译并运行上面的程序,这将产生以下结果:
Locale is: en_GB
Date is: Thu 23 Aug :32 MST
Locale is: de_DE
Date is: Do 23 Aug :32 MST
反馈内容(*必填)
截图标记颜色
联系方式(邮箱)
联系邮箱:
投稿页面:
记住登录状态
重复输入密码2995人阅读
编码(20)
在C运行库提供的多字节字符-宽字符转换函数:mbstowcs()/wcstombs()中,需要用到全局变量locale( locale encoding ),以指定多字节字符的编码类型
用来定义全局变量:locale(locale encoding)
&locale.h&
ANSI, Win 95, Win NT
_wsetlocale
&locale.h& or &wchar.h&
char&*setlocale(&int&category,&const&char&*locale&);
wchar_t&*_wsetlocale(&int&category,&const&wchar_t&*locale&);
1& category
指定全局变量locale会影响到的范围。宏和对应的影响范围如下:
All categories, as listed below
LC_COLLATE
The&strcoll, _stricoll, wcscoll, _wcsicoll,&and&strxfrm&functions
The character-handling functions (except&isdigit,&isxdigit,&mbstowcs, and&mbtowc, which are unaffected)
LC_MONETARY
Monetary-formatting information returned by the&localeconv&function
LC_NUMERIC
Decimal-point character for the formatted output routines (such as&printf), for the data-conversion routines, and for the nonmonetary-formatting information returned by&localeconv
The&strftime&and&wcsftime&functions
2&&locale&
指定locale的名称
如果取值为空字符串& &(注意,不是NULL),则locale与本地环境所使用的编码方式相同(在本地化时,应该很有用);
如果取值为“C”,则表示,所有的字符类型都用一字节来表示(取值小于256)&
简体中文的locale名称为:&chs&
4. 返回值:
如果locale和category都正确的话,会返回与指定的locale和category相关的字符串;
如果locale或者category不正确的话,会返回一个null指针,目前的locale全局变量不会改变
示例代码:
获取本地所使用的语言:
void main()
char * localLanguage=setlocale(LC_ALL, &&);
if(localLanguage==NULL)
printf(&获取本地语言类型失败\n&);
printf(&Locale Language is %s\n&, localLanguage);
输出如下:
Locale Language is Chinese_People's Republic of China.936
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:962623次
积分:10384
积分:10384
排名:第1431名
原创:187篇
转载:125篇
评论:73条
(38)(42)(20)(35)(48)(23)(29)(49)(25)(3)}

我要回帖

更多关于 php setlocale函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信