最近我在使用C語(yǔ)言進(jìn)行JSON數(shù)據(jù)處理的時(shí)候,遇到了一些亂碼問(wèn)題。經(jīng)過(guò)一番調(diào)試和查找資料,我終于找到了解決辦法,現(xiàn)在分享給大家。
在使用C語(yǔ)言進(jìn)行JSON數(shù)據(jù)處理時(shí),我們通常使用一些開(kāi)源的JSON庫(kù),比如cJSON。但是,使用cJSON序列化JSON數(shù)據(jù)時(shí),很容易出現(xiàn)亂碼問(wèn)題。
下面我們看一個(gè)例子:
cJSON *root = cJSON_CreateObject(); cJSON_AddStringToObject(root, "name", "張三"); cJSON_AddNumberToObject(root, "age", 18); char *json_str = cJSON_Print(root); printf("JSON字符串:%s\n", json_str);
在上面的例子中,我們使用cJSON_CreateObject創(chuàng)建了一個(gè)JSON對(duì)象,添加了一個(gè)字符串屬性和一個(gè)數(shù)字屬性,然后使用cJSON_Print將其序列化為JSON字符串并輸出。但是,當(dāng)你運(yùn)行這段代碼時(shí),你會(huì)發(fā)現(xiàn)輸出的JSON字符串中文會(huì)出現(xiàn)亂碼。
這是因?yàn)閏JSON默認(rèn)使用的是UTF-8編碼,而在我們的控制臺(tái)輸出時(shí),使用的可能是GBK編碼。所以,要解決這個(gè)問(wèn)題,我們需要將UTF-8編碼的JSON字符串轉(zhuǎn)換為GBK編碼。
下面是解決辦法:
#include <iconv.h> #include <stdlib.h> size_t utf8_to_gbk(char *inbuf, size_t inlen, char *outbuf, size_t outlen) { iconv_t cd; cd = iconv_open("GBK", "UTF-8"); if (cd == (iconv_t)-1) { perror("iconv_open"); exit(1); } size_t nconv = iconv(cd, &inbuf, &inlen, &outbuf, &outlen); if (nconv == (size_t)-1) { perror("iconv"); exit(1); } iconv_close(cd); return nconv; } cJSON *root = cJSON_CreateObject(); cJSON_AddStringToObject(root, "name", "張三"); char *json_str = cJSON_Print(root); size_t inlen = strlen(json_str); size_t outlen = inlen * 2; char *outbuf = (char*)calloc(outlen, 1); utf8_to_gbk(json_str, inlen, outbuf, outlen); printf("JSON字符串:%s\n", outbuf); free(outbuf);
上面的代碼中,我們定義了一個(gè)utf8_to_gbk函數(shù),它將輸入的UTF-8編碼字符串轉(zhuǎn)換為GBK編碼字符串。然后,在序列化JSON字符串后,我們先計(jì)算其長(zhǎng)度,然后申請(qǐng)一個(gè)足夠大的輸出緩沖區(qū),調(diào)用utf8_to_gbk函數(shù)將其轉(zhuǎn)換為GBK編碼,并最終輸出。
有了這個(gè)函數(shù),我們就可以愉快地序列化和反序列化中文字符了。