注意
本文最后更新于 2024-07-06,文中内容可能已过时。
有时我们在开发类 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
|