Home | History | Annotate | Download | only in unicode
      1 /*
      2 *******************************************************************************
      3 *
      4 *   Copyright (C) 2009-2013, International Business Machines
      5 *   Corporation and others.  All Rights Reserved.
      6 *
      7 *******************************************************************************
      8 *   file name:  unorm2.h
      9 *   encoding:   US-ASCII
     10 *   tab size:   8 (not used)
     11 *   indentation:4
     12 *
     13 *   created on: 2009dec15
     14 *   created by: Markus W. Scherer
     15 */
     16 
     17 #ifndef __UNORM2_H__
     18 #define __UNORM2_H__
     19 
     20 /**
     21  * \file
     22  * \brief C API: New API for Unicode Normalization.
     23  *
     24  * Unicode normalization functionality for standard Unicode normalization or
     25  * for using custom mapping tables.
     26  * All instances of UNormalizer2 are unmodifiable/immutable.
     27  * Instances returned by unorm2_getInstance() are singletons that must not be deleted by the caller.
     28  * For more details see the Normalizer2 C++ class.
     29  */
     30 
     31 #include "unicode/utypes.h"
     32 #include "unicode/localpointer.h"
     33 #include "unicode/uset.h"
     34 
     35 /**
     36  * Constants for normalization modes.
     37  * For details about standard Unicode normalization forms
     38  * and about the algorithms which are also used with custom mapping tables
     39  * see http://www.unicode.org/unicode/reports/tr15/
     40  * @stable ICU 4.4
     41  */
     42 typedef enum {
     43     /**
     44      * Decomposition followed by composition.
     45      * Same as standard NFC when using an "nfc" instance.
     46      * Same as standard NFKC when using an "nfkc" instance.
     47      * For details about standard Unicode normalization forms
     48      * see http://www.unicode.org/unicode/reports/tr15/
     49      * @stable ICU 4.4
     50      */
     51     UNORM2_COMPOSE,
     52     /**
     53      * Map, and reorder canonically.
     54      * Same as standard NFD when using an "nfc" instance.
     55      * Same as standard NFKD when using an "nfkc" instance.
     56      * For details about standard Unicode normalization forms
     57      * see http://www.unicode.org/unicode/reports/tr15/
     58      * @stable ICU 4.4
     59      */
     60     UNORM2_DECOMPOSE,
     61     /**
     62      * "Fast C or D" form.
     63      * If a string is in this form, then further decomposition <i>without reordering</i>
     64      * would yield the same form as DECOMPOSE.
     65      * Text in "Fast C or D" form can be processed efficiently with data tables
     66      * that are "canonically closed", that is, that provide equivalent data for
     67      * equivalent text, without having to be fully normalized.
     68      * Not a standard Unicode normalization form.
     69      * Not a unique form: Different FCD strings can be canonically equivalent.
     70      * For details see http://www.unicode.org/notes/tn5/#FCD
     71      * @stable ICU 4.4
     72      */
     73     UNORM2_FCD,
     74     /**
     75      * Compose only contiguously.
     76      * Also known as "FCC" or "Fast C Contiguous".
     77      * The result will often but not always be in NFC.
     78      * The result will conform to FCD which is useful for processing.
     79      * Not a standard Unicode normalization form.
     80      * For details see http://www.unicode.org/notes/tn5/#FCC
     81      * @stable ICU 4.4
     82      */
     83     UNORM2_COMPOSE_CONTIGUOUS
     84 } UNormalization2Mode;
     85 
     86 /**
     87  * Result values for normalization quick check functions.
     88  * For details see http://www.unicode.org/reports/tr15/#Detecting_Normalization_Forms
     89  * @stable ICU 2.0
     90  */
     91 typedef enum UNormalizationCheckResult {
     92   /**
     93    * The input string is not in the normalization form.
     94    * @stable ICU 2.0
     95    */
     96   UNORM_NO,
     97   /**
     98    * The input string is in the normalization form.
     99    * @stable ICU 2.0
    100    */
    101   UNORM_YES,
    102   /**
    103    * The input string may or may not be in the normalization form.
    104    * This value is only returned for composition forms like NFC and FCC,
    105    * when a backward-combining character is found for which the surrounding text
    106    * would have to be analyzed further.
    107    * @stable ICU 2.0
    108    */
    109   UNORM_MAYBE
    110 } UNormalizationCheckResult;
    111 
    112 /**
    113  * Opaque C service object type for the new normalization API.
    114  * @stable ICU 4.4
    115  */
    116 struct UNormalizer2;
    117 typedef struct UNormalizer2 UNormalizer2;  /**< C typedef for struct UNormalizer2. @stable ICU 4.4 */
    118 
    119 #if !UCONFIG_NO_NORMALIZATION
    120 
    121 /**
    122  * Returns a UNormalizer2 instance for Unicode NFC normalization.
    123  * Same as unorm2_getInstance(NULL, "nfc", UNORM2_COMPOSE, pErrorCode).
    124  * Returns an unmodifiable singleton instance. Do not delete it.
    125  * @param pErrorCode Standard ICU error code. Its input value must
    126  *                  pass the U_SUCCESS() test, or else the function returns
    127  *                  immediately. Check for U_FAILURE() on output or use with
    128  *                  function chaining. (See User Guide for details.)
    129  * @return the requested Normalizer2, if successful
    130  * @stable ICU 49
    131  */
    132 U_STABLE const UNormalizer2 * U_EXPORT2
    133 unorm2_getNFCInstance(UErrorCode *pErrorCode);
    134 
    135 /**
    136  * Returns a UNormalizer2 instance for Unicode NFD normalization.
    137  * Same as unorm2_getInstance(NULL, "nfc", UNORM2_DECOMPOSE, pErrorCode).
    138  * Returns an unmodifiable singleton instance. Do not delete it.
    139  * @param pErrorCode Standard ICU error code. Its input value must
    140  *                  pass the U_SUCCESS() test, or else the function returns
    141  *                  immediately. Check for U_FAILURE() on output or use with
    142  *                  function chaining. (See User Guide for details.)
    143  * @return the requested Normalizer2, if successful
    144  * @stable ICU 49
    145  */
    146 U_STABLE const UNormalizer2 * U_EXPORT2
    147 unorm2_getNFDInstance(UErrorCode *pErrorCode);
    148 
    149 /**
    150  * Returns a UNormalizer2 instance for Unicode NFKC normalization.
    151  * Same as unorm2_getInstance(NULL, "nfkc", UNORM2_COMPOSE, pErrorCode).
    152  * Returns an unmodifiable singleton instance. Do not delete it.
    153  * @param pErrorCode Standard ICU error code. Its input value must
    154  *                  pass the U_SUCCESS() test, or else the function returns
    155  *                  immediately. Check for U_FAILURE() on output or use with
    156  *                  function chaining. (See User Guide for details.)
    157  * @return the requested Normalizer2, if successful
    158  * @stable ICU 49
    159  */
    160 U_STABLE const UNormalizer2 * U_EXPORT2
    161 unorm2_getNFKCInstance(UErrorCode *pErrorCode);
    162 
    163 /**
    164  * Returns a UNormalizer2 instance for Unicode NFKD normalization.
    165  * Same as unorm2_getInstance(NULL, "nfkc", UNORM2_DECOMPOSE, pErrorCode).
    166  * Returns an unmodifiable singleton instance. Do not delete it.
    167  * @param pErrorCode Standard ICU error code. Its input value must
    168  *                  pass the U_SUCCESS() test, or else the function returns
    169  *                  immediately. Check for U_FAILURE() on output or use with
    170  *                  function chaining. (See User Guide for details.)
    171  * @return the requested Normalizer2, if successful
    172  * @stable ICU 49
    173  */
    174 U_STABLE const UNormalizer2 * U_EXPORT2
    175 unorm2_getNFKDInstance(UErrorCode *pErrorCode);
    176 
    177 /**
    178  * Returns a UNormalizer2 instance for Unicode NFKC_Casefold normalization.
    179  * Same as unorm2_getInstance(NULL, "nfkc_cf", UNORM2_COMPOSE, pErrorCode).
    180  * Returns an unmodifiable singleton instance. Do not delete it.
    181  * @param pErrorCode Standard ICU error code. Its input value must
    182  *                  pass the U_SUCCESS() test, or else the function returns
    183  *                  immediately. Check for U_FAILURE() on output or use with
    184  *                  function chaining. (See User Guide for details.)
    185  * @return the requested Normalizer2, if successful
    186  * @stable ICU 49
    187  */
    188 U_STABLE const UNormalizer2 * U_EXPORT2
    189 unorm2_getNFKCCasefoldInstance(UErrorCode *pErrorCode);
    190 
    191 /**
    192  * Returns a UNormalizer2 instance which uses the specified data file
    193  * (packageName/name similar to ucnv_openPackage() and ures_open()/ResourceBundle)
    194  * and which composes or decomposes text according to the specified mode.
    195  * Returns an unmodifiable singleton instance. Do not delete it.
    196  *
    197  * Use packageName=NULL for data files that are part of ICU's own data.
    198  * Use name="nfc" and UNORM2_COMPOSE/UNORM2_DECOMPOSE for Unicode standard NFC/NFD.
    199  * Use name="nfkc" and UNORM2_COMPOSE/UNORM2_DECOMPOSE for Unicode standard NFKC/NFKD.
    200  * Use name="nfkc_cf" and UNORM2_COMPOSE for Unicode standard NFKC_CF=NFKC_Casefold.
    201  *
    202  * @param packageName NULL for ICU built-in data, otherwise application data package name
    203  * @param name "nfc" or "nfkc" or "nfkc_cf" or name of custom data file
    204  * @param mode normalization mode (compose or decompose etc.)
    205  * @param pErrorCode Standard ICU error code. Its input value must
    206  *                  pass the U_SUCCESS() test, or else the function returns
    207  *                  immediately. Check for U_FAILURE() on output or use with
    208  *                  function chaining. (See User Guide for details.)
    209  * @return the requested UNormalizer2, if successful
    210  * @stable ICU 4.4
    211  */
    212 U_STABLE const UNormalizer2 * U_EXPORT2
    213 unorm2_getInstance(const char *packageName,
    214                    const char *name,
    215                    UNormalization2Mode mode,
    216                    UErrorCode *pErrorCode);
    217 
    218 /**
    219  * Constructs a filtered normalizer wrapping any UNormalizer2 instance
    220  * and a filter set.
    221  * Both are aliased and must not be modified or deleted while this object
    222  * is used.
    223  * The filter set should be frozen; otherwise the performance will suffer greatly.
    224  * @param norm2 wrapped UNormalizer2 instance
    225  * @param filterSet USet which determines the characters to be normalized
    226  * @param pErrorCode Standard ICU error code. Its input value must
    227  *                   pass the U_SUCCESS() test, or else the function returns
    228  *                   immediately. Check for U_FAILURE() on output or use with
    229  *                   function chaining. (See User Guide for details.)
    230  * @return the requested UNormalizer2, if successful
    231  * @stable ICU 4.4
    232  */
    233 U_STABLE UNormalizer2 * U_EXPORT2
    234 unorm2_openFiltered(const UNormalizer2 *norm2, const USet *filterSet, UErrorCode *pErrorCode);
    235 
    236 /**
    237  * Closes a UNormalizer2 instance from unorm2_openFiltered().
    238  * Do not close instances from unorm2_getInstance()!
    239  * @param norm2 UNormalizer2 instance to be closed
    240  * @stable ICU 4.4
    241  */
    242 U_STABLE void U_EXPORT2
    243 unorm2_close(UNormalizer2 *norm2);
    244 
    245 #if U_SHOW_CPLUSPLUS_API
    246 
    247 U_NAMESPACE_BEGIN
    248 
    249 /**
    250  * \class LocalUNormalizer2Pointer
    251  * "Smart pointer" class, closes a UNormalizer2 via unorm2_close().
    252  * For most methods see the LocalPointerBase base class.
    253  *
    254  * @see LocalPointerBase
    255  * @see LocalPointer
    256  * @stable ICU 4.4
    257  */
    258 U_DEFINE_LOCAL_OPEN_POINTER(LocalUNormalizer2Pointer, UNormalizer2, unorm2_close);
    259 
    260 U_NAMESPACE_END
    261 
    262 #endif
    263 
    264 /**
    265  * Writes the normalized form of the source string to the destination string
    266  * (replacing its contents) and returns the length of the destination string.
    267  * The source and destination strings must be different buffers.
    268  * @param norm2 UNormalizer2 instance
    269  * @param src source string
    270  * @param length length of the source string, or -1 if NUL-terminated
    271  * @param dest destination string; its contents is replaced with normalized src
    272  * @param capacity number of UChars that can be written to dest
    273  * @param pErrorCode Standard ICU error code. Its input value must
    274  *                   pass the U_SUCCESS() test, or else the function returns
    275  *                   immediately. Check for U_FAILURE() on output or use with
    276  *                   function chaining. (See User Guide for details.)
    277  * @return dest
    278  * @stable ICU 4.4
    279  */
    280 U_STABLE int32_t U_EXPORT2
    281 unorm2_normalize(const UNormalizer2 *norm2,
    282                  const UChar *src, int32_t length,
    283                  UChar *dest, int32_t capacity,
    284                  UErrorCode *pErrorCode);
    285 /**
    286  * Appends the normalized form of the second string to the first string
    287  * (merging them at the boundary) and returns the length of the first string.
    288  * The result is normalized if the first string was normalized.
    289  * The first and second strings must be different buffers.
    290  * @param norm2 UNormalizer2 instance
    291  * @param first string, should be normalized
    292  * @param firstLength length of the first string, or -1 if NUL-terminated
    293  * @param firstCapacity number of UChars that can be written to first
    294  * @param second string, will be normalized
    295  * @param secondLength length of the source string, or -1 if NUL-terminated
    296  * @param pErrorCode Standard ICU error code. Its input value must
    297  *                   pass the U_SUCCESS() test, or else the function returns
    298  *                   immediately. Check for U_FAILURE() on output or use with
    299  *                   function chaining. (See User Guide for details.)
    300  * @return first
    301  * @stable ICU 4.4
    302  */
    303 U_STABLE int32_t U_EXPORT2
    304 unorm2_normalizeSecondAndAppend(const UNormalizer2 *norm2,
    305                                 UChar *first, int32_t firstLength, int32_t firstCapacity,
    306                                 const UChar *second, int32_t secondLength,
    307                                 UErrorCode *pErrorCode);
    308 /**
    309  * Appends the second string to the first string
    310  * (merging them at the boundary) and returns the length of the first string.
    311  * The result is normalized if both the strings were normalized.
    312  * The first and second strings must be different buffers.
    313  * @param norm2 UNormalizer2 instance
    314  * @param first string, should be normalized
    315  * @param firstLength length of the first string, or -1 if NUL-terminated
    316  * @param firstCapacity number of UChars that can be written to first
    317  * @param second string, should be normalized
    318  * @param secondLength length of the source string, or -1 if NUL-terminated
    319  * @param pErrorCode Standard ICU error code. Its input value must
    320  *                   pass the U_SUCCESS() test, or else the function returns
    321  *                   immediately. Check for U_FAILURE() on output or use with
    322  *                   function chaining. (See User Guide for details.)
    323  * @return first
    324  * @stable ICU 4.4
    325  */
    326 U_STABLE int32_t U_EXPORT2
    327 unorm2_append(const UNormalizer2 *norm2,
    328               UChar *first, int32_t firstLength, int32_t firstCapacity,
    329               const UChar *second, int32_t secondLength,
    330               UErrorCode *pErrorCode);
    331 
    332 /**
    333  * Gets the decomposition mapping of c.
    334  * Roughly equivalent to normalizing the String form of c
    335  * on a UNORM2_DECOMPOSE UNormalizer2 instance, but much faster, and except that this function
    336  * returns a negative value and does not write a string
    337  * if c does not have a decomposition mapping in this instance's data.
    338  * This function is independent of the mode of the UNormalizer2.
    339  * @param norm2 UNormalizer2 instance
    340  * @param c code point
    341  * @param decomposition String buffer which will be set to c's
    342  *                      decomposition mapping, if there is one.
    343  * @param capacity number of UChars that can be written to decomposition
    344  * @param pErrorCode Standard ICU error code. Its input value must
    345  *                   pass the U_SUCCESS() test, or else the function returns
    346  *                   immediately. Check for U_FAILURE() on output or use with
    347  *                   function chaining. (See User Guide for details.)
    348  * @return the non-negative length of c's decomposition, if there is one; otherwise a negative value
    349  * @stable ICU 4.6
    350  */
    351 U_STABLE int32_t U_EXPORT2
    352 unorm2_getDecomposition(const UNormalizer2 *norm2,
    353                         UChar32 c, UChar *decomposition, int32_t capacity,
    354                         UErrorCode *pErrorCode);
    355 
    356 /**
    357  * Gets the raw decomposition mapping of c.
    358  *
    359  * This is similar to the unorm2_getDecomposition() function but returns the
    360  * raw decomposition mapping as specified in UnicodeData.txt or
    361  * (for custom data) in the mapping files processed by the gennorm2 tool.
    362  * By contrast, unorm2_getDecomposition() returns the processed,
    363  * recursively-decomposed version of this mapping.
    364  *
    365  * When used on a standard NFKC Normalizer2 instance,
    366  * unorm2_getRawDecomposition() returns the Unicode Decomposition_Mapping (dm) property.
    367  *
    368  * When used on a standard NFC Normalizer2 instance,
    369  * it returns the Decomposition_Mapping only if the Decomposition_Type (dt) is Canonical (Can);
    370  * in this case, the result contains either one or two code points (=1..4 UChars).
    371  *
    372  * This function is independent of the mode of the UNormalizer2.
    373  * @param norm2 UNormalizer2 instance
    374  * @param c code point
    375  * @param decomposition String buffer which will be set to c's
    376  *                      raw decomposition mapping, if there is one.
    377  * @param capacity number of UChars that can be written to decomposition
    378  * @param pErrorCode Standard ICU error code. Its input value must
    379  *                   pass the U_SUCCESS() test, or else the function returns
    380  *                   immediately. Check for U_FAILURE() on output or use with
    381  *                   function chaining. (See User Guide for details.)
    382  * @return the non-negative length of c's raw decomposition, if there is one; otherwise a negative value
    383  * @stable ICU 49
    384  */
    385 U_STABLE int32_t U_EXPORT2
    386 unorm2_getRawDecomposition(const UNormalizer2 *norm2,
    387                            UChar32 c, UChar *decomposition, int32_t capacity,
    388                            UErrorCode *pErrorCode);
    389 
    390 /**
    391  * Performs pairwise composition of a & b and returns the composite if there is one.
    392  *
    393  * Returns a composite code point c only if c has a two-way mapping to a+b.
    394  * In standard Unicode normalization, this means that
    395  * c has a canonical decomposition to a+b
    396  * and c does not have the Full_Composition_Exclusion property.
    397  *
    398  * This function is independent of the mode of the UNormalizer2.
    399  * @param norm2 UNormalizer2 instance
    400  * @param a A (normalization starter) code point.
    401  * @param b Another code point.
    402  * @return The non-negative composite code point if there is one; otherwise a negative value.
    403  * @stable ICU 49
    404  */
    405 U_STABLE UChar32 U_EXPORT2
    406 unorm2_composePair(const UNormalizer2 *norm2, UChar32 a, UChar32 b);
    407 
    408 /**
    409  * Gets the combining class of c.
    410  * The default implementation returns 0
    411  * but all standard implementations return the Unicode Canonical_Combining_Class value.
    412  * @param norm2 UNormalizer2 instance
    413  * @param c code point
    414  * @return c's combining class
    415  * @stable ICU 49
    416  */
    417 U_STABLE uint8_t U_EXPORT2
    418 unorm2_getCombiningClass(const UNormalizer2 *norm2, UChar32 c);
    419 
    420 /**
    421  * Tests if the string is normalized.
    422  * Internally, in cases where the quickCheck() method would return "maybe"
    423  * (which is only possible for the two COMPOSE modes) this method
    424  * resolves to "yes" or "no" to provide a definitive result,
    425  * at the cost of doing more work in those cases.
    426  * @param norm2 UNormalizer2 instance
    427  * @param s input string
    428  * @param length length of the string, or -1 if NUL-terminated
    429  * @param pErrorCode Standard ICU error code. Its input value must
    430  *                   pass the U_SUCCESS() test, or else the function returns
    431  *                   immediately. Check for U_FAILURE() on output or use with
    432  *                   function chaining. (See User Guide for details.)
    433  * @return TRUE if s is normalized
    434  * @stable ICU 4.4
    435  */
    436 U_STABLE UBool U_EXPORT2
    437 unorm2_isNormalized(const UNormalizer2 *norm2,
    438                     const UChar *s, int32_t length,
    439                     UErrorCode *pErrorCode);
    440 
    441 /**
    442  * Tests if the string is normalized.
    443  * For the two COMPOSE modes, the result could be "maybe" in cases that
    444  * would take a little more work to resolve definitively.
    445  * Use spanQuickCheckYes() and normalizeSecondAndAppend() for a faster
    446  * combination of quick check + normalization, to avoid
    447  * re-checking the "yes" prefix.
    448  * @param norm2 UNormalizer2 instance
    449  * @param s input string
    450  * @param length length of the string, or -1 if NUL-terminated
    451  * @param pErrorCode Standard ICU error code. Its input value must
    452  *                   pass the U_SUCCESS() test, or else the function returns
    453  *                   immediately. Check for U_FAILURE() on output or use with
    454  *                   function chaining. (See User Guide for details.)
    455  * @return UNormalizationCheckResult
    456  * @stable ICU 4.4
    457  */
    458 U_STABLE UNormalizationCheckResult U_EXPORT2
    459 unorm2_quickCheck(const UNormalizer2 *norm2,
    460                   const UChar *s, int32_t length,
    461                   UErrorCode *pErrorCode);
    462 
    463 /**
    464  * Returns the end of the normalized substring of the input string.
    465  * In other words, with <code>end=spanQuickCheckYes(s, ec);</code>
    466  * the substring <code>UnicodeString(s, 0, end)</code>
    467  * will pass the quick check with a "yes" result.
    468  *
    469  * The returned end index is usually one or more characters before the
    470  * "no" or "maybe" character: The end index is at a normalization boundary.
    471  * (See the class documentation for more about normalization boundaries.)
    472  *
    473  * When the goal is a normalized string and most input strings are expected
    474  * to be normalized already, then call this method,
    475  * and if it returns a prefix shorter than the input string,
    476  * copy that prefix and use normalizeSecondAndAppend() for the remainder.
    477  * @param norm2 UNormalizer2 instance
    478  * @param s input string
    479  * @param length length of the string, or -1 if NUL-terminated
    480  * @param pErrorCode Standard ICU error code. Its input value must
    481  *                   pass the U_SUCCESS() test, or else the function returns
    482  *                   immediately. Check for U_FAILURE() on output or use with
    483  *                   function chaining. (See User Guide for details.)
    484  * @return "yes" span end index
    485  * @stable ICU 4.4
    486  */
    487 U_STABLE int32_t U_EXPORT2
    488 unorm2_spanQuickCheckYes(const UNormalizer2 *norm2,
    489                          const UChar *s, int32_t length,
    490                          UErrorCode *pErrorCode);
    491 
    492 /**
    493  * Tests if the character always has a normalization boundary before it,
    494  * regardless of context.
    495  * For details see the Normalizer2 base class documentation.
    496  * @param norm2 UNormalizer2 instance
    497  * @param c character to test
    498  * @return TRUE if c has a normalization boundary before it
    499  * @stable ICU 4.4
    500  */
    501 U_STABLE UBool U_EXPORT2
    502 unorm2_hasBoundaryBefore(const UNormalizer2 *norm2, UChar32 c);
    503 
    504 /**
    505  * Tests if the character always has a normalization boundary after it,
    506  * regardless of context.
    507  * For details see the Normalizer2 base class documentation.
    508  * @param norm2 UNormalizer2 instance
    509  * @param c character to test
    510  * @return TRUE if c has a normalization boundary after it
    511  * @stable ICU 4.4
    512  */
    513 U_STABLE UBool U_EXPORT2
    514 unorm2_hasBoundaryAfter(const UNormalizer2 *norm2, UChar32 c);
    515 
    516 /**
    517  * Tests if the character is normalization-inert.
    518  * For details see the Normalizer2 base class documentation.
    519  * @param norm2 UNormalizer2 instance
    520  * @param c character to test
    521  * @return TRUE if c is normalization-inert
    522  * @stable ICU 4.4
    523  */
    524 U_STABLE UBool U_EXPORT2
    525 unorm2_isInert(const UNormalizer2 *norm2, UChar32 c);
    526 
    527 #endif  /* !UCONFIG_NO_NORMALIZATION */
    528 #endif  /* __UNORM2_H__ */
    529