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