作者:帅得不敢出门 C++爱好者灌水天堂群 3503799 转载请保留此信息
由于要解析fb2电子书文本,这方面似乎俄文资料比较多啊,没办法,摸着石头过河吧
利用网上的一个软件any2fb2把一段文本转换成fb2,用editplus直接打开fb2
文本内容:
汉 fb2 测试
fb2内容:
<?xml version="1.0" encoding="Windows-1251"?>
<FictionBook xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.gribuser.ru/xml/fictionbook/2.0"><description><title-info><genre></genre><author><first-name></first-name><middle-name></middle-name><last-name></last-name></author><book-title></book-title></title-info></description><body xmlns:fb="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:xlink="http://www.w3.org/1999/xlink">
<section><p>汉 fb2 测试</p>
</section>
</body>
</FictionBook>
有发现,小样,原来你穿了fb2的马甲,骨子里却是xml的种。
xml解析网上资料太多了,不感冒,现在说下这里面的"&#"开头,中间为数字,';'号结尾的东东吧。比如汉其实就是'汉',
这些字符浏览器可以自动转换的,现在我们来实现这个转换。
开头与结尾的字符不管它,取中间数字部分,网上有人说这些是utf-8的编码,不好意思,至少在这里是不正确的,
比如27721,这其实是十进制的,而不是十六进制,把它转成十六进制为0x6c49,正是'汉'的ucs2编码,其utf-8编码为E6B189。
接下来把它转换成ascii
WCHAR * wszUcs2 = L"/x6c49";
int len = WideCharToMultiByte(CP_ACP, 0, wszUcs2, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
szGBK[len] = '/0';
WideCharToMultiByte (CP_ACP, 0, wszUcs2, -1, szGBK, len, NULL,NULL);
MessageBoxA(NULL, szGBK, NULL, MB_OK);//输出'汉'
delete[] szGBK;