C++如何获取本地编码的名称

2017-10-10 18:58:32 +08:00
 justou

Python 中可以通过 locale.getpreferredencoding()来获取本地编码:

import locale
print(locale.getpreferredencoding())  # 我这得到 cp936

试了下 C++中的 locale

#include <locale>
#include <iostream> 

int main()
{
    std::locale loc;
    std::cout << loc.name() << std::endl;  // 我这打印出 C
    return 0;
}

C++中有没有简单的方法得到得到本地编码的名称, 比如"cp936", "utf-8"之类的...

1847 次点击
所在节点    C
5 条回复
wevsty
2017-10-10 20:08:00 +08:00
Windows 下面默认的 locale 就算 C,而不是系统的代码页
你可以用
std::locale::global(std::locale("chs"));
来设置 locale。
如果你想知道 Windows 系统的代码页设定,那么需要调用 API。
比如:GetACP,GetCPInfoEx
给你个例子
#include <windows.h>
void cout_loc()
{
CPINFOEX cpinfo = { 0 };
GetCPInfoEx(CP_ACP, 0, &cpinfo);
std::cout << cpinfo.CodePageName << std::endl;
}
pezy
2017-10-11 11:18:13 +08:00
```cpp
#include <iostream>
#include <locale>

int main()
{
std::setlocale(LC_ALL, "");
std::cout << "LC_ALL: " << std::setlocale(LC_ALL, NULL) << std::endl;
std::cout << "LC_CTYPE: " << std::setlocale(LC_CTYPE, NULL) << std::endl;
}
```
justou
2017-10-11 11:47:01 +08:00
@wevsty @pezy 谢谢
目前除了 setlocale 没发现其他更好的方法了, #include <locale> 要改成#include <clocale> 才能在 g++跟 vs 下编译通过.
我主要是要拿到"cp936", "uft8"之类的字符串用于文本编码转换, C++搞这个真是蛋疼
gnaggnoyil
2017-10-11 12:00:12 +08:00
不太清楚你想要的"本地编码"指的是什么.每个 ios_base 对象都会被指定一个 locale 的.你想要的是不是 std::cout.getloc() ?
justou
2017-10-11 22:24:32 +08:00
解决办法:

std::string getpreferredencoding()
{
std::string strCodePage = boost::locale::util::get_system_locale();
std::locale loc = boost::locale::generator().generate(strCodePage);
return std::use_facet<boost::locale::info>(loc).encoding();
}

https://stackoverflow.com/questions/46686649/c-get-the-user-preferred-encoding-or-locale-encoding/46690618#46690618

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/396556

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX