xerces-c解析中文的简单方法

大家在使用IBM的xerces-c的时候会碰到不能解析中文的问题,因为xercesc不支持中文编码。据说用xml4c可以支持中文,因为他支持的编码较多。还有说xml4c就是xercesc和icu的组合(ICU-International Components for Unicode)。又有说xml4c也对中文的支持时好时坏,这可不好办了呢。

看到了邹月明老师的《剖析Xml4C源码,完美兼容中文XML》一文后,看来只有自己动手才能治好xml解析的弊病,可是老师的方法是修改源代码,我手里没有啊。可不可以自己来进行转码呢(经过高人提醒),好的,就使用vc中的WideCharToMultiByte和MultiByteToWideChar两个API来试试吧。
xercesc包中的例子里面经常使用的有两个类:StrX和XStr(就是将char*和XMLCh*来回转换使用的)。修改这两个类的构造函数部分,也就是转码部分,就大功告成了,^_^。

//  StrX.hpp文件
//  ---------------------------------------------------------------------------
//  This is a simple class that lets us do easy (though not terribly efficient)
//  trancoding of XMLCh data to local code page for display.
//  ---------------------------------------------------------------------------
class  StrX
{
public :
// -----------------------------------------------------------------------
// Constructors and Destructor
// -----------------------------------------------------------------------
StrX(const XMLCh* const toTranscode)
{
if (toTranscode == NULL)
{
fLocalForm 
= NULL;
return;
}


int nResult = 0;

nResult 
= WideCharToMultiByte(CP_ACP, 0 ,toTranscode, -1 ,
0 , 0, NULL, NULL);
fLocalForm 
= new char[nResult];

nResult 
= WideCharToMultiByte(CP_ACP, 0 ,toTranscode, -1 ,
fLocalForm , nResult, NULL, NULL);

// Call the private transcoding method
// fLocalForm = XMLString::transcode(toTranscode);//这是修改前的调用方法
}


~StrX()
{
XMLString::release(
&fLocalForm);
}



// -----------------------------------------------------------------------
// Getter methods
// -----------------------------------------------------------------------
const char* localForm() const
{
return fLocalForm;
}



private :
// -----------------------------------------------------------------------
// Private data members
//
// fLocalForm
// This is the local code page form of the string.
// -----------------------------------------------------------------------
char* fLocalForm;
}
;

//  XStr.hpp文件
//  ---------------------------------------------------------------------------
//  This is a simple class that lets us do easy (though not terribly efficient)
//  trancoding of char* data to XMLCh data.
//  ---------------------------------------------------------------------------
class  XStr
{
public :
// -----------------------------------------------------------------------
// Constructors and Destructor
// -----------------------------------------------------------------------
XStr(const char* const toTranscode)
{
if (toTranscode == NULL)
{
fUnicodeForm 
= NULL;
return;
}


int nResult = 0;

nResult 
= MultiByteToWideChar(CP_ACP, 0, toTranscode, -1 , 00);
fUnicodeForm 
= new XMLCh[nResult];
nResult 
= MultiByteToWideChar(CP_ACP, 0, toTranscode, -1 ,
fUnicodeForm, nResult);

// Call the private transcoding method
// fUnicodeForm = XMLString::transcode(toTranscode);//这是修改前的调用方法
}


~XStr()
{
XMLString::release(
&fUnicodeForm);
}



// -----------------------------------------------------------------------
// Getter methods
// -----------------------------------------------------------------------
const XMLCh* unicodeForm() const
{
return fUnicodeForm;
}


private :
// -----------------------------------------------------------------------
// Private data members
//
// fUnicodeForm
// This is the Unicode XMLCh format of the string.
// -----------------------------------------------------------------------
XMLCh* fUnicodeForm;
}
;

欢迎大家批评指正
 

你可能感兴趣的:(xml,api,IBM,null,Class,Components)