日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

libxml2中文支持

發布時間:2024/1/23 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 libxml2中文支持 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? LibXML2自身已經支持了中文編碼,只是他的所有api處理的數據都是UTF-8類型的,所以只要在讀入和寫入數據時進行相應裝換即可!

代碼1是使用Linux下C API進行編碼轉換;

代碼2因為libxml2已經融合了iconv,使用了libxml2的函數來進行編碼轉換。

/* compile: gcc -l/usr/include/libxml2 -lxml2 iconv.c input:test.xml<?xml version="1.0" encoding="gb2312"?><parent>測試</parent> output:測試 1) iconv #include <libxml/xmlmemory.h> #include <libxml/parser.h> #include <arpa/inet.h> #include <iconv.h>char *Convert(char *encFrom, char *encTo, const char *in) {static char bufin[1024], bufout[1024], *sin, *sout;int mode, lenin, lenout, ret, nline;iconv_t c_pt;if ((c_pt = iconv_open(encTo, encFrom)) == (iconv_t)-1) {printf("iconv_open false: %s ==> %s\n", encFrom, encTo);return NULL;}iconv(c_pt, NULL, NULL, NULL, NULL);lenin = strlen(in) + 1;lenout = 1024;sin = (char *)in;sout = bufout;ret = iconv(c_pt, &sin, (size_t *)&lenin, &sout, (size_t *)&lenout);if (ret == -1) {return NULL;}iconv_close(c_pt);return bufout; }int main(void) {xmlDocPtr doc = NULL;xmlNodePtr cur = NULL;doc = xmlParseFile("test.xml");cur = xmlDocGetRootElement(doc);printf("%s\n", (char *)xmlNodeGetContent(cur));//printf(%s\n", Convert("utf-8", "gb2312", (char*)xmlNodeGetContent(cur))); }

2) xmlFindCharEncodingHandler

使用數據類型: xmlCharEncodingHandlerPtr

/******************************************* * compile: gcc -l/usr/include/libxml2/ -lxml2 convert.c * usage: convert utf-8 string or null * input: /convert 測試 * output:[wuqifu@localhost test]$ ./convert 測試ISO-8859-1:?虜芒脢脭 <?xml version="1.0" encoding="ISO-8859-1"?> <root>測試</root> **************************************/#include <libxml/encoding.h> /*** function name: ConvertInput* input:@in: string in a given encoding@encoding: the encoding used * description: Converts @in into UTF-8 for processing with libxml2 APIs * return: returns the converted UTF-8 string, or NULL in case of error. **/ unsigned char *ConvertInput(const char *in, const char *encoding) {unsigned char *out;int ret;int size;int out_size;int temp;xmlCharEncodingHandlerPtr handler;if (in == 0) return 0;handler = xmlFindCharEncodingHandler(encoding);if (!handler) {printf("ConvertInput: no encoding handler found for '%s'\n",encoding ? encoding : "");return 0;}size = (int) strlen(in) + 1;out_size = size * 2 - 1;out = (unsigned char *)xmlMalloc((size_t) out_size);if (out != 0) {temp = size - 1;ret = handler->input(out, &out_size, (const unsigned char *)in, &temp);if ((ret < 0) || (temp - size + 1)) {if (ret < 0) {printf("ConvertInput: conversion wasn't successful.\n");} else {printf("ConvertInput: conversion wasn't successful. converted: %i octets.\n", temp);}xmlFree(out);out = 0;} else {out = (unsigned char *)xmlRealloc(out, out_size + 1);out[out_size] = 0; /* null terminating out */}} else {printf("ConvertInput: no mem\n");}return out; }int main(int argc, char **argv) {unsigned char *content, *out;xmlDocPtr doc;xmlNodePtr rootnode;char *encoding = "ISO-8859-1"; //utf-8, ISO-8859-1if (argc <= 1) {printf("Usage: %s content\n", argv[0]);return (0);}content = argv[1];out = ConvertInput(content, encoding);printf("%s:%s\n", encoding, out);doc = xmlNewDoc("1.0");rootnode = xmlNewDocNode(doc, NULL, (const xmlChar*)"root", out);xmlDocSetRootElement(doc, rootnode);xmlSaveFormatFileEnc("=", doc, encoding, 1);return 1; }

?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的libxml2中文支持的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。