1 /* 2 ********************************************************************** 3 * Copyright (C) 2005-2007, International Business Machines 4 * Corporation and others. All Rights Reserved. 5 ********************************************************************** 6 * file name: ucsdet.h 7 * encoding: US-ASCII 8 * indentation:4 9 * 10 * created on: 2005Aug04 11 * created by: Andy Heninger 12 * 13 * ICU Character Set Detection, API for C 14 * 15 * Draft version 18 Oct 2005 16 * 17 */ 18 19 #ifndef __UCSDET_H 20 #define __UCSDET_H 21 22 #include "unicode/utypes.h" 23 24 #if !UCONFIG_NO_CONVERSION 25 #include "unicode/uenum.h" 26 27 /** 28 * \file 29 * \brief C API: Charset Detection API 30 * 31 * This API provides a facility for detecting the 32 * charset or encoding of character data in an unknown text format. 33 * The input data can be from an array of bytes. 34 * <p> 35 * Character set detection is at best an imprecise operation. The detection 36 * process will attempt to identify the charset that best matches the characteristics 37 * of the byte data, but the process is partly statistical in nature, and 38 * the results can not be guaranteed to always be correct. 39 * <p> 40 * For best accuracy in charset detection, the input data should be primarily 41 * in a single language, and a minimum of a few hundred bytes worth of plain text 42 * in the language are needed. The detection process will attempt to 43 * ignore html or xml style markup that could otherwise obscure the content. 44 */ 45 46 47 struct UCharsetDetector; 48 /** 49 * Structure representing a charset detector 50 * @stable ICU 3.6 51 */ 52 typedef struct UCharsetDetector UCharsetDetector; 53 54 struct UCharsetMatch; 55 /** 56 * Opaque structure representing a match that was identified 57 * from a charset detection operation. 58 * @stable ICU 3.6 59 */ 60 typedef struct UCharsetMatch UCharsetMatch; 61 62 /** 63 * Open a charset detector. 64 * 65 * @param status Any error conditions occurring during the open 66 * operation are reported back in this variable. 67 * @return the newly opened charset detector. 68 * @stable ICU 3.6 69 */ 70 U_STABLE UCharsetDetector * U_EXPORT2 71 ucsdet_open(UErrorCode *status); 72 73 /** 74 * Close a charset detector. All storage and any other resources 75 * owned by this charset detector will be released. Failure to 76 * close a charset detector when finished with it can result in 77 * memory leaks in the application. 78 * 79 * @param ucsd The charset detector to be closed. 80 * @stable ICU 3.6 81 */ 82 U_STABLE void U_EXPORT2 83 ucsdet_close(UCharsetDetector *ucsd); 84 85 /** 86 * Set the input byte data whose charset is to detected. 87 * 88 * Ownership of the input text byte array remains with the caller. 89 * The input string must not be altered or deleted until the charset 90 * detector is either closed or reset to refer to different input text. 91 * 92 * @param ucsd the charset detector to be used. 93 * @param textIn the input text of unknown encoding. . 94 * @param len the length of the input text, or -1 if the text 95 * is NUL terminated. 96 * @param status any error conditions are reported back in this variable. 97 * 98 * @stable ICU 3.6 99 */ 100 U_STABLE void U_EXPORT2 101 ucsdet_setText(UCharsetDetector *ucsd, const char *textIn, int32_t len, UErrorCode *status); 102 103 104 /** Set the declared encoding for charset detection. 105 * The declared encoding of an input text is an encoding obtained 106 * by the user from an http header or xml declaration or similar source that 107 * can be provided as an additional hint to the charset detector. 108 * 109 * How and whether the declared encoding will be used during the 110 * detection process is TBD. 111 * 112 * @param ucsd the charset detector to be used. 113 * @param encoding an encoding for the current data obtained from 114 * a header or declaration or other source outside 115 * of the byte data itself. 116 * @param length the length of the encoding name, or -1 if the name string 117 * is NUL terminated. 118 * @param status any error conditions are reported back in this variable. 119 * 120 * @stable ICU 3.6 121 */ 122 U_STABLE void U_EXPORT2 123 ucsdet_setDeclaredEncoding(UCharsetDetector *ucsd, const char *encoding, int32_t length, UErrorCode *status); 124 125 126 /** 127 * Return the charset that best matches the supplied input data. 128 * 129 * Note though, that because the detection 130 * only looks at the start of the input data, 131 * there is a possibility that the returned charset will fail to handle 132 * the full set of input data. 133 * <p> 134 * The returned UCharsetMatch object is owned by the UCharsetDetector. 135 * It will remain valid until the detector input is reset, or until 136 * the detector is closed. 137 * <p> 138 * The function will fail if 139 * <ul> 140 * <li>no charset appears to match the data.</li> 141 * <li>no input text has been provided</li> 142 * </ul> 143 * 144 * @param ucsd the charset detector to be used. 145 * @param status any error conditions are reported back in this variable. 146 * @return a UCharsetMatch representing the best matching charset, 147 * or NULL if no charset matches the byte data. 148 * 149 * @stable ICU 3.6 150 */ 151 U_STABLE const UCharsetMatch * U_EXPORT2 152 ucsdet_detect(UCharsetDetector *ucsd, UErrorCode *status); 153 154 155 /** 156 * Find all charset matches that appear to be consistent with the input, 157 * returning an array of results. The results are ordered with the 158 * best quality match first. 159 * 160 * Because the detection only looks at a limited amount of the 161 * input byte data, some of the returned charsets may fail to handle 162 * the all of input data. 163 * <p> 164 * The returned UCharsetMatch objects are owned by the UCharsetDetector. 165 * They will remain valid until the detector is closed or modified 166 * 167 * <p> 168 * Return an error if 169 * <ul> 170 * <li>no charsets appear to match the input data.</li> 171 * <li>no input text has been provided</li> 172 * </ul> 173 * 174 * @param ucsd the charset detector to be used. 175 * @param matchesFound pointer to a variable that will be set to the 176 * number of charsets identified that are consistent with 177 * the input data. Output only. 178 * @param status any error conditions are reported back in this variable. 179 * @return A pointer to an array of pointers to UCharSetMatch objects. 180 * This array, and the UCharSetMatch instances to which it refers, 181 * are owned by the UCharsetDetector, and will remain valid until 182 * the detector is closed or modified. 183 * @stable ICU 3.6 184 */ 185 U_STABLE const UCharsetMatch ** U_EXPORT2 186 ucsdet_detectAll(UCharsetDetector *ucsd, int32_t *matchesFound, UErrorCode *status); 187 188 189 190 /** 191 * Get the name of the charset represented by a UCharsetMatch. 192 * 193 * The storage for the returned name string is owned by the 194 * UCharsetMatch, and will remain valid while the UCharsetMatch 195 * is valid. 196 * 197 * The name returned is suitable for use with the ICU conversion APIs. 198 * 199 * @param ucsm The charset match object. 200 * @param status Any error conditions are reported back in this variable. 201 * @return The name of the matching charset. 202 * 203 * @stable ICU 3.6 204 */ 205 U_STABLE const char * U_EXPORT2 206 ucsdet_getName(const UCharsetMatch *ucsm, UErrorCode *status); 207 208 /** 209 * Get a confidence number for the quality of the match of the byte 210 * data with the charset. Confidence numbers range from zero to 100, 211 * with 100 representing complete confidence and zero representing 212 * no confidence. 213 * 214 * The confidence values are somewhat arbitrary. They define an 215 * an ordering within the results for any single detection operation 216 * but are not generally comparable between the results for different input. 217 * 218 * A confidence value of ten does have a general meaning - it is used 219 * for charsets that can represent the input data, but for which there 220 * is no other indication that suggests that the charset is the correct one. 221 * Pure 7 bit ASCII data, for example, is compatible with a 222 * great many charsets, most of which will appear as possible matches 223 * with a confidence of 10. 224 * 225 * @param ucsm The charset match object. 226 * @param status Any error conditions are reported back in this variable. 227 * @return A confidence number for the charset match. 228 * 229 * @stable ICU 3.6 230 */ 231 U_STABLE int32_t U_EXPORT2 232 ucsdet_getConfidence(const UCharsetMatch *ucsm, UErrorCode *status); 233 234 /** 235 * Get the RFC 3066 code for the language of the input data. 236 * 237 * The Charset Detection service is intended primarily for detecting 238 * charsets, not language. For some, but not all, charsets, a language is 239 * identified as a byproduct of the detection process, and that is what 240 * is returned by this function. 241 * 242 * CAUTION: 243 * 1. Language information is not available for input data encoded in 244 * all charsets. In particular, no language is identified 245 * for UTF-8 input data. 246 * 247 * 2. Closely related languages may sometimes be confused. 248 * 249 * If more accurate language detection is required, a linguistic 250 * analysis package should be used. 251 * 252 * The storage for the returned name string is owned by the 253 * UCharsetMatch, and will remain valid while the UCharsetMatch 254 * is valid. 255 * 256 * @param ucsm The charset match object. 257 * @param status Any error conditions are reported back in this variable. 258 * @return The RFC 3066 code for the language of the input data, or 259 * an empty string if the language could not be determined. 260 * 261 * @stable ICU 3.6 262 */ 263 U_STABLE const char * U_EXPORT2 264 ucsdet_getLanguage(const UCharsetMatch *ucsm, UErrorCode *status); 265 266 267 /** 268 * Get the entire input text as a UChar string, placing it into 269 * a caller-supplied buffer. A terminating 270 * NUL character will be appended to the buffer if space is available. 271 * 272 * The number of UChars in the output string, not including the terminating 273 * NUL, is returned. 274 * 275 * If the supplied buffer is smaller than required to hold the output, 276 * the contents of the buffer are undefined. The full output string length 277 * (in UChars) is returned as always, and can be used to allocate a buffer 278 * of the correct size. 279 * 280 * 281 * @param ucsm The charset match object. 282 * @param buf A UChar buffer to be filled with the converted text data. 283 * @param cap The capacity of the buffer in UChars. 284 * @param status Any error conditions are reported back in this variable. 285 * @return The number of UChars in the output string. 286 * 287 * @stable ICU 3.6 288 */ 289 U_STABLE int32_t U_EXPORT2 290 ucsdet_getUChars(const UCharsetMatch *ucsm, 291 UChar *buf, int32_t cap, UErrorCode *status); 292 293 294 295 /** 296 * Get an iterator over the set of all detectable charsets - 297 * over the charsets that are known to the charset detection 298 * service. 299 * 300 * The returned UEnumeration provides access to the names of 301 * the charsets. 302 * 303 * The state of the Charset detector that is passed in does not 304 * affect the result of this function, but requiring a valid, open 305 * charset detector as a parameter insures that the charset detection 306 * service has been safely initialized and that the required detection 307 * data is available. 308 * 309 * @param ucsd a Charset detector. 310 * @param status Any error conditions are reported back in this variable. 311 * @return an iterator providing access to the detectable charset names. 312 * @stable ICU 3.6 313 */ 314 U_STABLE UEnumeration * U_EXPORT2 315 ucsdet_getAllDetectableCharsets(const UCharsetDetector *ucsd, UErrorCode *status); 316 317 318 /** 319 * Test whether input filtering is enabled for this charset detector. 320 * Input filtering removes text that appears to be HTML or xml 321 * markup from the input before applying the code page detection 322 * heuristics. 323 * 324 * @param ucsd The charset detector to check. 325 * @return TRUE if filtering is enabled. 326 * @stable ICU 3.6 327 */ 328 U_STABLE UBool U_EXPORT2 329 ucsdet_isInputFilterEnabled(const UCharsetDetector *ucsd); 330 331 332 /** 333 * Enable filtering of input text. If filtering is enabled, 334 * text within angle brackets ("<" and ">") will be removed 335 * before detection, which will remove most HTML or xml markup. 336 * 337 * @param ucsd the charset detector to be modified. 338 * @param filter <code>true</code> to enable input text filtering. 339 * @return The previous setting. 340 * 341 * @stable ICU 3.6 342 */ 343 U_STABLE UBool U_EXPORT2 344 ucsdet_enableInputFilter(UCharsetDetector *ucsd, UBool filter); 345 346 #endif 347 #endif /* __UCSDET_H */ 348 349 350