U_CAPI void U_EXPORT2 ucnv_cbToUWriteSub (UConverterToUnicodeArgs *args, int32_t offsetIndex, UErrorCode * err) { static const UChar kSubstituteChar1 = 0x1A, kSubstituteChar = 0xFFFD; /* could optimize this case, just one uchar */ if(args->converter->invalidCharLength == 1 && args->converter->subChar1 != 0) { ucnv_cbToUWriteUChars(args, &kSubstituteChar1, 1, offsetIndex, err); } else { ucnv_cbToUWriteUChars(args, &kSubstituteChar, 1, offsetIndex, err); } }
void CIRCSocket::IcuExtToUCallback( UConverterToUnicodeArgs* toArgs, const char* codeUnits, int32_t length, UConverterCallbackReason reason, UErrorCode* err) { // From http://www.mirc.com/colors.html // The Control+O key combination in mIRC inserts ascii character 15, // which turns off all previous attributes, including color, bold, underline, and italics. // // \x02 bold // \x03 mIRC-compatible color // \x04 RRGGBB color // \x0F normal/reset (turn off bold, colors, etc.) // \x12 reverse (weechat) // \x16 reverse (mirc, kvirc) // \x1D italic // \x1F underline // Also see http://www.visualirc.net/tech-attrs.php // // Keep in sync with CUser::AddTimestamp and CIRCSocket::IcuExtFromUCallback static const std::set<char> scAllowedChars = {'\x02', '\x03', '\x04', '\x0F', '\x12', '\x16', '\x1D', '\x1F'}; if (reason == UCNV_ILLEGAL && length == 1 && scAllowedChars.count(*codeUnits)) { *err = U_ZERO_ERROR; UChar c = *codeUnits; ucnv_cbToUWriteUChars(toArgs, &c, 1, 0, err); return; } Csock::IcuExtToUCallback(toArgs, codeUnits, length, reason, err); }
static void decoderReplaceCallback(const void* rawContext, UConverterToUnicodeArgs* toArgs, const char*, int32_t, UConverterCallbackReason, UErrorCode* err) { if (!rawContext) { return; } const DecoderCallbackContext* context = reinterpret_cast<const DecoderCallbackContext*>(rawContext); *err = U_ZERO_ERROR; ucnv_cbToUWriteUChars(toArgs,context->replacementChars, context->replacementCharCount, 0, err); }
/*uses uprv_itou to get a unicode escape sequence of the offensive sequence, *and uses that as the substitution sequence */ U_CAPI void U_EXPORT2 UCNV_TO_U_CALLBACK_ESCAPE ( const void *context, UConverterToUnicodeArgs *toArgs, const char* codeUnits, int32_t length, UConverterCallbackReason reason, UErrorCode * err) { UChar uniValueString[VALUE_STRING_LENGTH]; int32_t valueStringLength = 0; int32_t i = 0; if (reason > UCNV_IRREGULAR) { return; } if(context==NULL) { while (i < length) { uniValueString[valueStringLength++] = (UChar) UNICODE_PERCENT_SIGN_CODEPOINT; /* adding % */ uniValueString[valueStringLength++] = (UChar) UNICODE_X_CODEPOINT; /* adding X */ valueStringLength += uprv_itou (uniValueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint8_t) codeUnits[i++], 16, 2); } } else { switch(*((char*)context)) { case UCNV_PRV_ESCAPE_XML_DEC: while (i < length) { uniValueString[valueStringLength++] = (UChar) UNICODE_AMP_CODEPOINT; /* adding & */ uniValueString[valueStringLength++] = (UChar) UNICODE_HASH_CODEPOINT; /* adding # */ valueStringLength += uprv_itou (uniValueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint8_t)codeUnits[i++], 10, 0); uniValueString[valueStringLength++] = (UChar) UNICODE_SEMICOLON_CODEPOINT; /* adding ; */ } break; case UCNV_PRV_ESCAPE_XML_HEX: while (i < length) { uniValueString[valueStringLength++] = (UChar) UNICODE_AMP_CODEPOINT; /* adding & */ uniValueString[valueStringLength++] = (UChar) UNICODE_HASH_CODEPOINT; /* adding # */ uniValueString[valueStringLength++] = (UChar) UNICODE_X_LOW_CODEPOINT; /* adding x */ valueStringLength += uprv_itou (uniValueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint8_t)codeUnits[i++], 16, 0); uniValueString[valueStringLength++] = (UChar) UNICODE_SEMICOLON_CODEPOINT; /* adding ; */ } break; case UCNV_PRV_ESCAPE_C: while (i < length) { uniValueString[valueStringLength++] = (UChar) UNICODE_RS_CODEPOINT; /* adding \ */ uniValueString[valueStringLength++] = (UChar) UNICODE_X_LOW_CODEPOINT; /* adding x */ valueStringLength += uprv_itou (uniValueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint8_t)codeUnits[i++], 16, 2); } break; default: while (i < length) { uniValueString[valueStringLength++] = (UChar) UNICODE_PERCENT_SIGN_CODEPOINT; /* adding % */ uniValueString[valueStringLength++] = (UChar) UNICODE_X_CODEPOINT; /* adding X */ uprv_itou (uniValueString + valueStringLength, VALUE_STRING_LENGTH - valueStringLength, (uint8_t) codeUnits[i++], 16, 2); valueStringLength += 2; } } } /* reset the error */ *err = U_ZERO_ERROR; ucnv_cbToUWriteUChars(toArgs, uniValueString, valueStringLength, 0, err); }