locale.h
<locale.h> 提供本地化支持,允许程序适应不同地区的语言、字符集、数字格式、日期格式等。C 程序默认使用 "C" locale(经典 C 风格),可以切换到系统默认 locale 或其他特定 locale。
基本用法
#include <locale.h>
#include <stdio.h>
/* 设置所有类别为系统默认 */
setlocale(LC_ALL, "");
/* 查询当前 locale */
char *loc = setlocale(LC_ALL, NULL);
printf("Current locale: %s\n", loc);
locale 类别
| 类别 | 影响 |
|---|---|
LC_ALL | 所有类别 |
LC_COLLATE | 字符串比较和排序 |
LC_CTYPE | 字符分类和转换 |
LC_MONETARY | 货币格式 |
LC_NUMERIC | 数字格式(小数点等) |
LC_TIME | 日期和时间格式 |
数字格式
#include <locale.h>
#include <stdio.h>
setlocale(LC_NUMERIC, "de_DE"); /* 德语:小数点用逗号 */
printf("%.2f\n", 3.14); /* 3,14 */
货币格式
#include <locale.h>
struct lconv *lc = localeconv();
printf("Currency symbol: %s\n", lc->currency_symbol);
printf("Decimal point: %s\n", lc->decimal_point);
常见错误
忽略 locale 影响:
setlocale(LC_ALL, ""); /* 切换到系统 locale */
/* 现在 sscanf("3.14", "%f", &x) 在德语 locale 可能失败 */
/* 因为德语用 ',' 作为小数点 */
不检查返回值:
setlocale(LC_ALL, "invalid"); /* 失败,返回 NULL */
/* 程序继续运行,但 locale 未改变 */
/* 正确 */
if (setlocale(LC_ALL, "") == NULL) {
fprintf(stderr, "Locale setting failed\n");
}
最佳实践
- 需要本地化时显式设置 locale
- 解析固定格式数据时保持
"C"locale - 用
localeconv()获取格式信息 - 多线程注意 locale 是全局的
- 网络协议、文件格式用
"C"locale