UConverter* ICUUnicodeSupport::_openConverter<2>(ConstStringHolder<2> _encoding) { UErrorCode errorCode = U_ZERO_ERROR; UConverter* cnv = ucnv_openU( char_cast<const UChar*>( _encoding.c_str() ), &errorCode); CHECK_ICU_ERROR_CODE(errorCode); return cnv; }
// --------------------------------------------------------------------------- // ICUTransService: The protected virtual transcoding service API // --------------------------------------------------------------------------- XMLTranscoder* ICUTransService:: makeNewXMLTranscoder(const XMLCh* const encodingName , XMLTransService::Codes& resValue , const unsigned int blockSize , MemoryManager* const manager) { // // For encodings that end with "s390" we need to strip off the "s390" // from the encoding name and add ",swaplfnl" to the encoding name // that we pass into ICU on the ucnv_openU. // XMLCh* encodingNameToUse = (XMLCh*) encodingName; XMLCh* workBuffer = 0; if ( (XMLString::endsWith(encodingNameToUse, gs390Id)) || (XMLString::endsWith(encodingNameToUse, gS390Id)) ) { int workBufferSize = (XMLString::stringLen(encodingNameToUse) + XMLString::stringLen(gswaplfnlId) - XMLString::stringLen(gS390Id) + 1); workBuffer = (XMLCh*) manager->allocate(workBufferSize * sizeof(XMLCh)); int moveSize = XMLString::stringLen(encodingNameToUse) - XMLString::stringLen(gS390Id); XMLString::moveChars(workBuffer, encodingNameToUse, moveSize); XMLString::moveChars((workBuffer + moveSize), gswaplfnlId, XMLString::stringLen(gswaplfnlId)); encodingNameToUse = workBuffer; } // // If UChar and XMLCh are not the same size, then we have premassage the // encoding name into a UChar type string. // const UChar* actualName; UChar* tmpName = 0; if (sizeof(UChar) == sizeof(XMLCh)) { actualName = (const UChar*)encodingNameToUse; } else { tmpName = convertToUChar(encodingNameToUse, 0, manager); actualName = tmpName; } ArrayJanitor<UChar> janTmp(tmpName, manager); ArrayJanitor<XMLCh> janTmp1(workBuffer, manager); UErrorCode uerr = U_ZERO_ERROR; UConverter* converter = ucnv_openU(actualName, &uerr); if (!converter) { resValue = XMLTransService::UnsupportedEncoding; return 0; } return new (manager) ICUTranscoder(encodingName, converter, blockSize, manager); }