在C語言中,我們經常需要處理JSON格式的數據,其中包含了中文字符。但是,當我們使用C語言接收JSON數據時,可能會遇到中文亂碼的問題。那么,該如何解決呢?
// 示例代碼 int main(){ char *json_str = "{\"name\": \"張三\", \"age\": 18}"; cJSON *json = cJSON_Parse(json_str); if (json) { cJSON *name = cJSON_GetObjectItemCaseSensitive(json, "name"); printf("%s\n", name->valuestring); cJSON_Delete(json); } else { printf("error\n"); } return 0; }
在上述代碼中,我們使用了cJSON庫來處理JSON數據。但當我們運行程序,輸出結果為“姹傚瓧”,而不是“張三”。這是因為我們沒有正確地處理JSON數據中的中文字符。
解決方法如下:
#includechar *utf82gbk(const char *src) { iconv_t conv = iconv_open("GBK", "UTF-8"); const size_t inbytesleft = strlen(src); size_t outbytesleft = inbytesleft * 2; char *const outbuf = malloc(outbytesleft); char *outp = outbuf; const char *inbuf = src; size_t ret = iconv(conv, &inbuf, &inbytesleft, &outp, &outbytesleft); if (ret == (size_t) -1) { printf("iconv error: %s\n", strerror(errno)); free(outbuf); return NULL; } if (iconv_close(conv) == -1) { printf("iconv_close error: %s\n", strerror(errno)); free(outbuf); return NULL; } *outp = '\0'; return outbuf; } int main(){ char *json_str = "{\"name\": \"張三\", \"age\": 18}"; char *gbk_str = utf82gbk(json_str); cJSON *json = cJSON_Parse(gbk_str); if (json) { cJSON *name = cJSON_GetObjectItemCaseSensitive(json, "name"); printf("%s\n", name->valuestring); cJSON_Delete(json); } else { printf("error\n"); } free(gbk_str); return 0; }
在代碼中我們添加了一個函數utf82gbk來將UTF-8編碼的字符串轉換成GBK編碼的字符串。這樣,我們就可以正確地讀取JSON數據中的中文字符。