在使用C語(yǔ)言解析Json時(shí),經(jīng)常會(huì)遇到漢字亂碼的問(wèn)題,主要原因是Json中的字符串默認(rèn)采用的是Unicode編碼,而在C語(yǔ)言中,需要使用一些特殊的函數(shù)來(lái)處理Unicode編碼。
解決這個(gè)問(wèn)題的方法是,在讀取Json時(shí),先將Unicode編碼的字符串轉(zhuǎn)換為UTF-8編碼的字符串,這樣就可以正確地處理中文字符了。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <jansson.h> int main() { //讀取Json文件 FILE *file = fopen("test.json", "r"); if (file == NULL) { printf("Can't open file: test.json!\n"); exit(1); } //獲取Json文件大小 fseek(file, 0, SEEK_END); int filesize = ftell(file); fseek(file, 0, SEEK_SET); //讀取Json文件內(nèi)容 char *buffer = (char*)malloc(filesize); fread(buffer, 1, filesize, file); fclose(file); //將Unicode編碼的字符串轉(zhuǎn)換為UTF-8編碼的字符串 json_error_t error; json_t *root = json_loadb(buffer, filesize, 0, &error); if (!root) { printf("Json error on line %d: %s\n", error.line, error.text); free(buffer); exit(1); } char *str = json_dumps(root, JSON_INDENT(2) | JSON_UNESCAPED_UNICODE); printf("%s\n", str); free(str); free(buffer); return 0; }
在上面的代碼中,我們使用了json_loadb函數(shù)來(lái)讀取Json文件中的數(shù)據(jù),并使用json_dumps函數(shù)將Json數(shù)據(jù)轉(zhuǎn)換成一個(gè)UTF-8編碼的字符串。注意,json_dumps函數(shù)的第二個(gè)參數(shù)中使用了JSON_UNESCAPED_UNICODE選項(xiàng)來(lái)避免對(duì)中文字符進(jìn)行轉(zhuǎn)義。
通過(guò)上面的方法,我們就可以避免在C語(yǔ)言中處理Json時(shí)出現(xiàn)中文亂碼的問(wèn)題了。