色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

c 序列化json亂碼

最近我在使用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ù),我們就可以愉快地序列化和反序列化中文字符了。