//+--------------------------------------------------------------------------- // // Copyright (C) 1996, Microsoft Corporation. // // File: htmlchar.cxx // // Contents: Contains a translate table from WCHAR to HTML WCHAR // Translates an WCHAR string to its HTML equivalent // // History: 96/Jan/3 DwightKr Created // 19 Nov 1997 AlanW Added missing named entities. Allow // for outputing numeric entities if // codepage translation fails. // //---------------------------------------------------------------------------- #include #pragma hdrstop #include struct WCHAR_TO_HTML { WCHAR * wszTranslated; ULONG cchTranslated; }; //+--------------------------------------------------------------------------- //---------------------------------------------------------------------------- static const struct WCHAR_TO_HTML WCHAR_TO_HTML[] = { L"never", 0xffffffff, // 0 end-of-string 0, 0, // 1 0, 0, // 2 0, 0, // 3 0, 0, // 4 0, 0, // 5 0, 0, // 6 0, 0, // 7 0, 0, // 8 L"\t", 1, // 9 tab L"\n", 1, // 10 newline 0, 0, // 11 0, 0, // 12 L"\r", 1, // 13 carriage return 0, 0, // 14 0, 0, // 15 0, 0, // 16 0, 0, // 17 0, 0, // 18 0, 0, // 19 0, 0, // 20 0, 0, // 21 0, 0, // 22 0, 0, // 23 0, 0, // 24 0, 0, // 25 0, 0, // 26 0, 0, // 27 0, 0, // 28 0, 0, // 29 0, 0, // 30 0, 0, // 31 L" ", 1, // 32 L"!", 1, // 33 L""", 6, // 34 L"#", 1, // 35 L"$", 1, // 36 L"%", 1, // 37 L"&", 5, // 38 L"'", 1, // 39 L"(", 1, // 40 L")", 1, // 41 L"*", 1, // 42 L"+", 1, // 43 L",", 1, // 44 L"-", 1, // 45 L".", 1, // 46 L"/", 1, // 47 L"0", 1, // 48 L"1", 1, // 49 L"2", 1, // 50 L"3", 1, // 51 L"4", 1, // 52 L"5", 1, // 53 L"6", 1, // 54 L"7", 1, // 55 L"8", 1, // 56 L"9", 1, // 57 L":", 1, // 58 L";", 1, // 59 L"<", 4, // 60 L"=", 1, // 61 L">", 4, // 62 L"?", 1, // 63 L"@", 1, // 64 L"A", 1, // 65 L"B", 1, // 66 L"C", 1, // 67 L"D", 1, // 68 L"E", 1, // 69 L"F", 1, // 70 L"G", 1, // 71 L"H", 1, // 72 L"I", 1, // 73 L"J", 1, // 74 L"K", 1, // 75 L"L", 1, // 76 L"M", 1, // 77 L"N", 1, // 78 L"O", 1, // 79 L"P", 1, // 80 L"Q", 1, // 81 L"R", 1, // 82 L"S", 1, // 83 L"T", 1, // 84 L"U", 1, // 85 L"V", 1, // 86 L"W", 1, // 87 L"X", 1, // 88 L"Y", 1, // 89 L"Z", 1, // 90 L"[", 1, // 91 L"\\", 1, // 92 L"]", 1, // 93 L"^", 1, // 94 L"_", 1, // 95 L"`", 1, // 96 L"a", 1, // 97 L"b", 1, // 98 L"c", 1, // 99 L"d", 1, // 100 L"e", 1, // 101 L"f", 1, // 102 L"g", 1, // 103 L"h", 1, // 104 L"i", 1, // 105 L"j", 1, // 106 L"k", 1, // 107 L"l", 1, // 108 L"m", 1, // 109 L"n", 1, // 110 L"o", 1, // 111 L"p", 1, // 112 L"q", 1, // 113 L"r", 1, // 114 L"s", 1, // 115 L"t", 1, // 116 L"u", 1, // 117 L"v", 1, // 118 L"w", 1, // 119 L"x", 1, // 120 L"y", 1, // 121 L"z", 1, // 122 L"{", 1, // 123 L"|", 1, // 124 L"}", 1, // 125 L"~", 1, // 126 0, 0, // 127 0, 0, // 128 0, 0, // 129 0, 0, // 130 0, 0, // 131 0, 0, // 132 0, 0, // 133 0, 0, // 134 0, 0, // 135 0, 0, // 136 0, 0, // 137 0, 0, // 138 0, 0, // 139 0, 0, // 140 0, 0, // 141 0, 0, // 142 0, 0, // 143 0, 0, // 144 0, 0, // 145 0, 0, // 146 0, 0, // 147 0, 0, // 148 0, 0, // 149 0, 0, // 150 0, 0, // 151 0, 0, // 152 0, 0, // 153 0, 0, // 154 0, 0, // 155 0, 0, // 156 0, 0, // 157 0, 0, // 158 0, 0, // 159 L" ", 6, // 160 L"¡", 7, // 161 L"¢", 6, // 162 L"£", 7, // 163 L"¤", 8, // 164 L"¥", 5, // 165 L"¦", 8, // 166 L"§", 6, // 167 L"¨", 5, // 168 L"©", 6, // 169 L"ª", 6, // 170 - feminine ordinal indicator L"«", 7, // 171 L"¬", 5, // 172 - not sign L"­", 5, // 173 - soft hyphen L"®", 5, // 174 L"¯", 6, // 175 L"°", 5, // 176 L"±", 8, // 177 L"²", 6, // 178 L"³", 6, // 179 L"´", 7, // 180 L"µ", 7, // 181 L"¶", 6, // 182 L"·", 8, // 183 L"¸", 7, // 184 L"¹", 6, // 185 L"º", 6, // 186 - masculine ordinal indicator L"»", 7, // 187 L"¼", 8, // 188 L"½", 8, // 189 L"¾", 8, // 190 L"¿", 8, // 191 L"À", 8, // 192 L"Á", 8, // 193 L"Â", 7, // 194 L"Ã", 8, // 195 L"Ä", 6, // 196 L"Å", 7, // 197 L"Æ", 7, // 198 L"Ç", 8, // 199 L"È", 8, // 200 L"É", 8, // 201 L"Ê", 7, // 202 L"Ë", 6, // 203 L"Ì", 8, // 204 L"Í", 8, // 205 L"Î", 7, // 206 L"Ï", 6, // 207 L"Ð", 5, // 208 L"Ñ", 8, // 209 L"Ò", 8, // 210 L"Ó", 8, // 211 L"Ô", 7, // 212 L"Õ", 8, // 213 L"Ö", 6, // 214 L"×", 7, // 215 L"Ø", 8, // 216 L"Ù", 8, // 217 L"Ú", 8, // 218 L"Û", 7, // 219 L"Ü", 6, // 220 L"Ý", 8, // 221 L"Þ", 7, // 222 L"ß", 7, // 223 L"à", 8, // 224 L"á", 8, // 225 L"â", 7, // 226 L"ã", 8, // 227 L"ä", 6, // 228 L"å", 7, // 229 L"æ", 7, // 230 L"ç", 8, // 231 L"è", 8, // 232 L"é", 8, // 233 L"ê", 7, // 234 L"ë", 6, // 235 L"ì", 8, // 236 L"í", 8, // 237 L"î", 7, // 238 L"ï", 6, // 239 L"ð", 5, // 240 L"ñ", 8, // 241 L"ò", 8, // 242 L"ó", 8, // 243 L"ô", 7, // 244 L"õ", 8, // 245 L"ö", 6, // 246 L"÷", 8, // 247 L"ø", 8, // 248 L"ù", 8, // 249 L"ú", 8, // 250 L"û", 7, // 251 L"ü", 6, // 252 L"ý", 8, // 253 L"þ", 7, // 254 L"ÿ", 6, // 255 }; //+--------------------------------------------------------------------------- // // Function: HTMLEscapeW, public // // Synopsis: Appends an escaped version of a string to a virtual string. // // Arguments: [wcsString] - string to be translated // [StrResult] - CVirtualString to which result will be appended // [ulCodePage] - output codepage // // History: 96/Apr/03 dlee Created. // //---------------------------------------------------------------------------- void HTMLEscapeW( WCHAR const * wcsString, CVirtualString & StrResult, ULONG ulCodePage ) { unsigned iUnicodeOutputMethod = 0; do { if ( *wcsString < 256 ) { const struct WCHAR_TO_HTML &Entry = WCHAR_TO_HTML[*wcsString]; if ( 1 == Entry.cchTranslated ) { StrResult.CharCat( *Entry.wszTranslated ); wcsString++; continue; } // Do the check for end-of-string here, as this is an // unusual code-path. This saves a compare per loop. if ( 0 == *wcsString ) break; // it's ok to pass 0 to StrCat StrResult.StrCat( Entry.wszTranslated, Entry.cchTranslated ); } else { // // A unicode character >= 256 has been found. Either leave it // as-is in the output string, or convert to the numeric HTML // entity, depending on whether all unicode characters in the // string can be translated using the codepage. // if ( 0 == iUnicodeOutputMethod ) { iUnicodeOutputMethod++; BOOL fUsedDefaultChar = FALSE; int cchOut = WideCharToMultiByte( ulCodePage, #if (WINVER >= 0x0500) WC_NO_BEST_FIT_CHARS | #endif // (WINVER >= 0x0500) WC_COMPOSITECHECK | WC_DEFAULTCHAR, wcsString, -1, 0, 0, 0, &fUsedDefaultChar ); Win4Assert( cchOut != 0 || ERROR_INVALID_PARAMETER == GetLastError() ); if ( fUsedDefaultChar || cchOut == 0 && ERROR_INVALID_PARAMETER == GetLastError() ) iUnicodeOutputMethod++; } if ( 1 == iUnicodeOutputMethod ) { StrResult.CharCat( *wcsString ); } else { Win4Assert( 2 == iUnicodeOutputMethod ); // Output the numeric html entity USHORT wch = *wcsString; WCHAR achNum[6]; _itow( wch, achNum, 10 ); StrResult.CharCat( L'&' ); StrResult.CharCat( L'#' ); StrResult.StrCat( achNum ); StrResult.CharCat( L';' ); } } wcsString++; } while( TRUE ); }