任务需要将某些数据替换为阿拉伯字符的格式,因为之前对外文字符的处理没有任何经验,特此记录下。
转换步骤:
因为之前的工程是字符集是多字节的,转换为Unicode字符集需要适配的地方太多,故放弃了,直接在多字节下做了处理。
1. 因为需要存储unicode字符,所以存储必须用wchar_t, CString在多字节下貌似不支持unicode字符,String在任何字符集下都不支持unicode。
2. 字符定义时需要用L指定为宽字符
wchar_t Arabic[32] = { L'٠', L'١', L'٢', L'٣', L'٤', L'٥', L'٦', L'٧', L'٨', L'٩', L'ا', L'ب', L'ح', L'د', L'ر', L'س', L'ص', L'ط', L'ع', L'ق', L'ك', L'ل', L'م', L'ن', L'هـ', L'و', L'ى' };
3. 宽字符有专门的字符处理函数,wcscpy, wcslen
4. 在wchar_t下拼凑好字符串后,因为要传给gSoap传输,还要转回多字节。
char * wchar2char(const wchar_t* wchar)
{
char * m_char;
int len = WideCharToMultiByte(CP_UTF8, 0, wchar, wcslen(wchar), NULL, 0, NULL, NULL);
m_char = new char[len + 1];
WideCharToMultiByte(CP_UTF8, 0, wchar, wcslen(wchar), m_char, len, NULL, NULL);
m_char[len] = '\0';
return m_char;
}
5. 设置gSoap支持utf-8传输
soap_init(&sFlow_soap);
soap_set_mode(&sFlow_soap, SOAP_C_UTFSTRIN);
6. 最后一个问题是偶然发现的暂时不知道原因,如果将优化打开,转译功能也会失败,内容会变为乱码,需要全部设置为关闭。