V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
justou
V2EX  ›  C

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

  •  
  •   justou · 2017-10-10 18:58:32 +08:00 · 1945 次点击
    这是一个创建于 2604 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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"之类的...

    5 条回复    2017-10-11 22:24:32 +08:00
    wevsty
        1
    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
        2
    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
        3
    justou  
    OP
       2017-10-11 11:47:01 +08:00
    @wevsty @pezy 谢谢
    目前除了 setlocale 没发现其他更好的方法了, #include <locale> 要改成#include <clocale> 才能在 g++跟 vs 下编译通过.
    我主要是要拿到"cp936", "uft8"之类的字符串用于文本编码转换, C++搞这个真是蛋疼
    gnaggnoyil
        4
    gnaggnoyil  
       2017-10-11 12:00:12 +08:00
    不太清楚你想要的"本地编码"指的是什么.每个 ios_base 对象都会被指定一个 locale 的.你想要的是不是 std::cout.getloc() ?
    justou
        5
    justou  
    OP
       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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5436 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 145ms · UTC 08:24 · PVG 16:24 · LAX 00:24 · JFK 03:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.