CTP 中文乱码解析

有时我们在开发类 CTP 接口(如 CTP、TORA)等,会遇到中文消息乱码的现象,这是由于接口采用了 GB10830 等编码规范,无法直接在终端使用 UTF8 进行解析。因此,我们需要在接收层面进行解码,同时配置系统的解码标准。

c++ 解码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#pragma once
#include <locale>
#include <codecvt>
#include <string>

namespace snail
{

template <class Facet>
struct deletable_facet : Facet
{
    template <class... Args>
    deletable_facet(Args &&... args) : Facet(std::forward<Args>(args)...) {}
    ~deletable_facet() {}
};

inline std::wstring string2wstring(const std::string &str, const std::string &locale)
{
    typedef deletable_facet<std::codecvt_byname<wchar_t, char, std::mbstate_t>> F;
    static std::wstring_convert<F> strCnv(new F(locale));
    return strCnv.from_bytes(str);
}

inline std::string wstring2utf8string(const std::wstring &str)
{
    static std::wstring_convert<std::codecvt_utf8<wchar_t>> strCnv;
    return strCnv.to_bytes(str);
}

inline std::string str2utf8(const std::string &str)
{
    return wstring2utf8string(string2wstring(str, "zh_CN.GB18030"));
}

} // namespace snail

上面封装了接口 str2utf8,可以用来解析中文信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
bool check_rsp(CTORATstpRspInfoField *pRspInfoField, const char* func_name)
{
    if (unlikely(pRspInfoField && pRspInfoField->ErrorID != 0))
    {
        L_err("[tora_gw] ", func_name,
              ", ErrorID:", pRspInfoField->ErrorID,
              ", ErrorMsg:", str2utf8(pRspInfoField->ErrorMsg));
        return false;
    }
    else
    {
        return true;
    }
}

系统设置

同时,我们还需要在系统层面进行设置

1
2
3
4
5
6
## CentOS
yum install -y kde-l10n-Chinese
localedef -c -f GB18030 -i zh_CN zh_CN.GB18030

## Ubuntu
localedef -c -f GB18030 -i zh_CN zh_CN.GB18030
william 支付宝支付宝
william 微信微信
0%