- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
以下程序使用 setlocale()
从环境变量中获取区域设置,并打印时间。
locale_test.c:
// locale test
#include <stdio.h>
#include <locale.h>
#include <time.h>
// locale test
void locale_test() {
// use environment variable to get locale setting,
setlocale(LC_ALL, "");
char buf[26];
time_t now = time(NULL);
ctime_r(&now, buf);
printf("time: %s", buf);
char *time_locale = setlocale(LC_TIME, NULL);
printf("current LC_TIME locale: %s\n", time_locale);
}
int main(int argc, char *argv[]) {
locale_test();
return 0;
}
执行:
LC_ALL=fr_FR LC_TIME=fr_FR ./a.out
,输出为:
time: Wed Oct 14 13:16:35 2015
current LC_TIME locale: C
LC_ALL=en_US LC_TIME=en_US ./a.out
,输出为:
time: Wed Oct 14 13:17:12 2015
current LC_TIME locale: C
问题是:
LC_TIME
时,它只打印 C
,而不是从环境变量指定的值。更新 - 解决方案:
根据评论和回答,进行了以下更改:
locale -a
strftime()
代替 ctime()
生成时间字符串新程序:
// locale test
#include <stdio.h>
#include <locale.h>
#include <time.h>
// locale test
void locale_test() {
// use environment variable to get locale setting,
if(setlocale(LC_ALL, "") == NULL) {
printf("error while setlocale()\n");
}
// get current LC_TIME
char *time_locale = setlocale(LC_TIME, NULL);
if(time_locale == NULL) {
printf("error while setlocale()\n");
} else {
printf("LC_TIME: %s\n", time_locale);
}
// print time in locale,
size_t buf_size = 50;
char buf[buf_size];
// char *format = "%F %T %z";
char *format = "%A, %d %B %Y, %H:%M:%S %Z";
time_t now = time(NULL);
struct tm tm_now;
localtime_r(&now, &tm_now);
strftime(buf, buf_size, format, &tm_now);
printf("time: %s\n", buf);
}
int main(int argc, char *argv[]) {
locale_test();
return 0;
}
然后执行:
LC_ALL=en_US.utf8 LC_TIME=en_US.utf8 ./a.out
,输出为:
LC_TIME: en_US.utf8
time: Wednesday, 14 October 2015, 16:36:36 CST
LC_ALL=zh_CN.utf8 LC_TIME=zh_CN.utf8 ./a.out
,输出为:
LC_TIME: zh_CN.utf8
time: 星期三, 14 十月 2015, 16:38:10 CST
LC_ALL=en_US.utf8 LC_TIME=en_US.utf8 ./a.out
,输出为:
LC_TIME: ja_JP.utf8
time: 水曜日, 14 10月 2015, 16:40:05 CST
这是预期的工作。
最佳答案
您必须检查 setlocale
的返回值,因为如果 locale 字符串无效、未安装您想要的 locale 或其他一些原因,它将失败。
if (setlocale(LC_ALL, "") == NULL) {
puts("Unable to set locale");
}
您可以使用 locale -a
检查可用的语言环境。也许您确实安装了法语语言环境,但您必须使用 fr_FR.utf8
进行设置。
然后,ctime
输出不依赖于区域设置; standard指定其确切格式,并且始终为英文。对于本地化输出,请改用 strftime
。
关于c - setlocale() 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33117258/
我想弄清楚 C++ 是如何支持 Unicode 的。 当我想将多语言文本输出到控制台时,我调用 std::setlocale .但是我注意到结果取决于之前对 setlocale 的调用. 考虑以下示例
如果我不使用fputws使用setlocale,则仅输出ASCII字母。似乎setlocale是必需的,并且根据this site,setlocale(LC_CTYPE, "UTF-8")和setlo
不允许在共享CentOS服务器上进行编译。因此,我在我的 Debian 计算机上编译我的程序,将其与 Debian 的系统库(如 libc 等)链接。然后我上传我的程序和 Debian 系统库,我的程
我需要为我的应用程序创建一个 SQLite 数据库。我需要用几种欧洲语言存储文本,因此会有大量重音字符和其他奇怪的标记。我正在扩展 SQLiteOpenHelper。 检查 .db 文件时,我注意到有
This paper说 setlocale() 是线程不安全的。是否有任何线程安全的方法来设置语言环境。 我正在用 C++ 编写代码,但如果有任何不同,C 库中的函数将使用语言环境。 这基本上就是我现
这个问题在这里已经有了答案: Is setlocale thread-safe function? (6 个答案) 关闭 6 年前。 CppRef states 2016-12-13 09:00 U
我编写了一个将 wstring 转换为字符串的函数。如果我删除代码 setlocale(LC_CTYPE, ""),程序就会出错。我引用了 cplusplus阅读文档。 C string contai
以下程序使用 setlocale() 从环境变量中获取区域设置,并打印时间。 locale_test.c: // locale test #include #include #include /
我正在学习 C++,我发现了 C++ 库的这个功能:setlocale ( http://www.cplusplus.com/reference/clocale/setlocale/ ) 但我无法理解
我有一个 Linux 系统,该系统设置为某个语言环境并运行一个 C++ 应用程序。我可以从 C++ 应用程序或操作系统本身执行 std::setlocale(LC_NUMERIC, "en_US.UT
我们目前面临的问题是,当使用 Windows 文件打开/保存对话框时加载的外部组件(不幸的是我们不知道是哪个)一些系统更改了进程的区域设置,可能是通过调用 setlocale(LC_ALL, "").
我需要更改线程中的区域设置以正确解析带有 strtod() 的 double ,为此我使用 setlocale() (C++)。它是线程安全的吗? 更新:另一个问题。当我在 main() 函数中调用
我有一些带有(瑞士)法语字符的字符串,我想大写(PHP 5.3)。 echo strtoupper('société'); 由于 strtoupper() 不适用于重字符,我做了一个 setlocal
根据 PHP,“语言环境信息由每个进程维护”。我的理解是否正确,这与使用 Apache 服务器的每个脚本实例相同? 换句话说,如果我有几个使用不同区域设置的并发 session ,一个用户区域设置的更
问题已解决(见下文) 我已经在我的服务器上生成了区域设置,我已经确认它们存在(我的区域设置 -a 在下面提供),但是当我使用时: setlocale(LC_TIME,'fr_FR');
我想在 php 中对包含德语“umlaute”的数组进行排序。这对于php来说似乎不是一件容易的事。我在网上找到了以下示例: $oldLocale=setlocale(LC_COLLATE, "0")
setlocale() 的默认设置是什么意思? setlocale()默认为“C”(“POSIX”)。但这到底是什么意思呢?它的默认字符集和语言是什么?是“en_US.utf8”吗? 最佳答案 来自
setlocale() 函数没有设置所需的语言(德语)。 目标是输出月份名称。 这是我到目前为止的测试代码:
JSTL 标签用于设置用户本地化环境。 语法 JSP 标签的语法如下: 其中: localcode:代表语言代码,例如,ZH、EN。也可以在后面加上国家或者地区的两位数代码,中间用_连接,如
#include #include #include "mainwindow.hpp" #include "../RegisterOfErrors.hpp" #include extern st
我是一名优秀的程序员,十分优秀!