关于C/C++和python字符串编码

上次实习的时候写了个鸟项目,编码的事情一直没清楚,因为那个项目主要是英文居多,所以什么编码一般都不会出问题。

int main() {
    const char* nihao = "你好";
    const wchar_t* lnihao = L"你好গা";
    for (int i = 0; i < strlen(nihao); i++)
        printf("%x ", (unsigned char)nihao[i]);
    printf("\n");

    for (int i = 0; i < wcslen(lnihao); i++)
        printf("%x ", (wchar_t)lnihao[i]);
    printf("\n");
}

结果

c4 e3 ba c3
4f60 597d 997 9be

使用gb2312肯定是比unicode省内存的,但是标准库用不了啊
当时那个破项目是unicode转utf-8,然后我直接用标准库直接操作utf-8了。现在想起来应该是先在unicode编码上用标准库把算法完成,然后再转utf-8传到服务器上的,不然非英文直接爆炸。

demo明天写,先整顿小夜宵了。

int main() {
    std::wcout.imbue(std::locale("chs")); //output Chinese
    const char* nihao = "你好";
    const wchar_t* lnihao = L"你好গা";
    for (int i = 0; i < strlen(nihao); i++)
        printf("%x ", (unsigned char)nihao[i]);
    printf("\n");

    for (int i = 0; i < wcslen(lnihao); i++)
        printf("%x ", (wchar_t)lnihao[i]);
    printf("\n");

    std::cout << lnihao[0] << std::endl;
    std::cout << lnihao[3] << std::endl;

    std::wcout << lnihao[0] << std::endl; //[你]
    std::wcout << lnihao[1] << std::endl; //[好]
    std::wcout << lnihao[2] << std::endl; //没输出,因为গা字符占lnihao[3],lnihao[4]

    std::wstring wsnihao = lnihao;
    std::cout << "sizeof wstring " << wsnihao.size() << std::endl; // 4
    std::cout << "length wstring " << wsnihao.length() << std::endl;// 4 

    // 那么如何输出大于2字节的unicode字符呢
}

unicode编码转换工具 http://www.esjson.com/unicodeEncode.html https://www.ifreesite.com/unicode-ascii-ansi.htm gb2312编码转换 https://www.haomeili.net/HanZi/ZiFuBianMaZhuanHuan?ToCode=gb2312