我的配置:

  • 编译器:gnu gcc 4.8.2
  • 我使用C++ 11编译
  • 平台/操作系统:Linux 64位Ubuntu 14.04.1 LTS

  • 我想用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_tXmlCh是等效的,尽管不能隐式转换。您仍然需要在它们之间进行投射。但这至少比转码便宜。
  • 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/

    10-13 08:25