我的配置:
我想用wchar_t *提供一种方法,并在许多需要XMLCh *的xecerces库方法中使用它,但是我不知道如何从一种方法转换为另一种方法。如果您使用char *代替wchar_t *很简单,但是我需要使用宽字符。在Windows下,我可以轻松地从一个窗口投射到另一个窗口,但是在我的linux机器上它不起作用。我必须以某种方式手动将wchar_t *转换为XMLCh *
我通过libxerces-c-3.1.so库进行链接,该库仅使用XMLCh *。 XMLCh可以处理宽字符,但我不知道如何将其提供给它,以及如何从XMLCh *中获取wchar_t *
我开发了这个方法,但是它不起作用(这里我吐出一个wstring,它比指针更容易管理清理内存:
static inline std::wstring XMLCh2W(const XMLCh* tagname)
{
std::wstring wstr;
XMLSize_t len1 = XMLString::stringLen(tagname);
XMLSize_t outLen = len1 * 4;
XMLByte ut8[outLen+1];
XMLSize_t charsEaten = 0;
XMLTransService::Codes failReason; //Ok | UnsupportedEncoding | InternalFailure | SupportFilesNotFound
XMLTranscoder* transcoder = XMLPlatformUtils::fgTransService->makeNewTranscoderFor("UTF-8", failReason,16*1024);
unsigned int utf8Len = transcoder->transcodeTo(tagname,len1,ut8,outLen,charsEaten,XMLTranscoder::UnRep_Throw);// XMLTranscoder::UnRep_Throw UnRep_RepChar
ut8[utf8Len] = 0;
std::wstring wstr = std::wstring((wchar_t*)ut8);//I'm not sure this is actually ok to do
return wstr;
}
最佳答案
不,您不能在GCC下执行此操作,因为GCC将wchar_t
定义为32位,UTF-32 / UCS-4-编码(对于实际用途而言,差异并不重要)字符串,而Xerces-c将XmlCh定义为16位UTF-16编码的字符串。
我发现最好的方法是对UTF-16字符串使用C++ 11支持:
char16_t
和XmlCh
是等效的,尽管不能隐式转换。您仍然需要在它们之间进行投射。但这至少比转码便宜。 std::basic_string<char16_t>
是等效的字符串类型。 u"str"
和u's'
形式的文字。 不幸的是,尽管
wchar_t
文字是UTF-16编码的,但是VC++不支持C++ 11 UTF-16文字。因此,我最终在标题中看到了以下内容:#if defined _MSC_VER
#define U16S(x) L##x
typedef wchar_t my_u16_char_t;
typedef std::wstring my_u16_string_t;
typedef std::wstringstream my_u16_sstream_t;
inline XmlCh* XmlString(my_u16_char_t* s) { return s; }
inline XmlCh* XmlString(my_u16_string_t* s) { return s.c_str(); }
#elif defined __linux
#define U16S(x) u##x
typedef char16_t my_u16_char_t;
typedef std::basic_string<my_u16_char_t> my_u16_string_t;
typedef std::basic_stringstream<my_u16_char_t> my_u16_sstream_t;
inline XmlCh* XmlString(my_u16_char_t* s) { return reinterpret_cast<XmlCh*>(s); }
inline XmlCh* XmlString(my_u16_string_t* s) { return XmlString(s.c_str()); }
#endif
它是IMO,相当困惑,但是直到VC++支持C++ 11 Unicode文字,我才可以看到它已经解决了,可以直接用
char16_t
重写Xerces。关于c++ - XMLCh转换为wchar_t,反之亦然,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25839725/