Provided by: libunac1-dev_1.8.0-10_amd64 bug

NAME

       unac - remove accents from string or character

SYNOPSIS

       #include <unac.h>

       const char* unac_version();

       int unac_string(const char* charset,
                 const char* in, int in_length,
                 char** out, int* out_length);

       int unac_string_utf16(const char* in, int in_length,
                 char** out, int* out_length);

       /* MACRO: side effect on unaccented and length arguments */
       unac_char_utf16(unsigned short c,
                       unsigned short* unaccented,
                       int length);

       const char* unac_version()

       /*
        * The level argument can be one of:
        *    UNAC_DEBUG_NONE UNAC_DEBUG_LOW UNAC_DEBUG_HIGH
        */
       void unac_debug(int level)

       typedef void (*unac_debug_print_t)(const char* message, void* data);
       void unac_debug_callback(int level, unac_debug_print_t function, void* data)

DESCRIPTION

       unac  is  a C library that removes accents from characters, regardless of the character set (ISO-8859-15,
       ISO-CELTIC, KOI8-RU...) as long as iconv(3) is able to convert it into UTF-16 (Unicode).

       The unac_string function is given a charset (ISO-8859-15 for instance) and  a  string.  It  converts  the
       string  into  UTF-16  and  calls  the  unac_string_utf16  function  to remove all accents from the UTF-16
       version. The unaccented string is then converted into the original charset (ISO-8859-15 for instance) and
       returned to the caller of unac_string.

       unac does a little more than removing accents: every character that is made of two character  such  as  æ
       (ISO-8859-15  octal  code 346) will be expanded in two characters a and e.  Should a character be made of
       three characters, it would be decomposed in the same way.

       The conversion from and to UTF-16 is done with iconv(3).  The iconv -l command will  list  all  available
       charsets.  Using  UTF-16  as a pivot implies an overhead but ensures that accents can be removed from all
       character for which there is an equivalent character in Unicode.

       unac_char_utf16 is a CPP macro that returns a pointer to the unaccented  equivalent  of  a  given  UTF-16
       character. It is the basic building block of unac.

       unac_string_utf16 repeatidly applies the unac_char_utf16 macro to each character of an UTF-16 string.

FUNCTIONS

       int unac_string(const char* charset, const char* in, size_t in_length, char** out, size_t* out_length)

              Returns  the  unaccented  equivalent of the string 'in' of length 'in_length' bytes.  The returned
              string is stored in the pointer pointed by the 'out' argument and the length of the 'out'  string,
              in  bytes,  is stored in the integer pointed by the 'out_length ' argument.  If the '*out' pointer
              is not null, it must point to an area allocated by malloc(3) and the length of the array  must  be
              specified  in the '*out_length' argument. Both arguments '*out' and '*out_length' will be replaced
              with the return values when the function returns on success. The '*out' pointer  may  point  to  a
              memory location that has been reallocated (using realloc(3)) by the unac_string function. There is
              no  guarantee  that  '*out' is identical to the value given by the caller. The pointer provided as
              '*out' by the caller may not be useable when the function returns (either error or  success).   If
              the '*out' pointer is null, the unac_string function allocates a new memory block using malloc(3).
              It is the responsibility of the caller to deallocate the area returned in the '*out' pointer.

              The  return value of unac_string is 0 on success and -1 on error, in which case the errno variable
              is set to the corresponding error code. See the ERROR section  below  for  more  information.  The
              iconv(3) manual page may also help.

       int unac_string_utf16(const char* in, int in_length, char** out, int* out_length)

              Has  the  same  effect  as  unac_string("UTF-16",  in,  in_length,  out,  out_length).   Since the
              unac_string_utf16 is the backend function of the unac_string function it is more efficient because
              no charset conversion of the input string (from and to UTF-16) is necessary.

       unac_char_utf16(const unsigned short c, unsigned short* p, int l)

              Warning: this is a macro, each argument may be evaluated more than once.  Returns  the  unaccented
              equivalent of the UTF-16 character 'c' in the pointer 'p'.  The length of the unsigned short array
              pointed by 'p' is returned in the 'l' argument.

       const char* unac_version()

              Return the version number of unac.

       void unac_debug(int level)
              Set  the  debug level of the unac library to 'level'.  Possible values are: UNAC_DEBUG_NONE for no
              debug at all, UNAC_DEBUG_LOW for  terse  human  readable  information,  UNAC_DEBUG_HIGH  for  very
              detailed information only usable when translating a few strings.

              unac_debug_callback with anything but UNAC_DEBUG_NONE is not thread safe.

       void unac_debug_callback(int level, unac_debug_print_t function, void* data)

              Set  the  debug  level  and  define  a  printing function callback.  The 'level' is the same as in
              unac_debug. The 'function' is in charge of dealing with the debug messages,  presumably  to  print
              them  to  the  user.   The 'data' is an opaque pointer that is passed along to function, should it
              need to manage a persistent context.

              The prototype of 'function' accepts two arguments. The first is the debug message  (const  char*),
              the second is the opaque pointer given as 'data' argument to unac_debug_callback.

              If 'function' is NULL, messages are printed on the standard error output using fprintf(stderr...).

              unac_debug_callback with anything but UNAC_DEBUG_NONE is not thread safe.

ERRORS

       EINVAL

              the requested conversion pair is not available. For instance, when specifying the ISO-0000 charset
              (imaginary), it means it is not possible to convert from ISO-0000 to UTF-16.

EXAMPLES

       Convert the été string into ete.
       #include <unac.h>

       char* out = 0;
       int out_length = 0;
       if(unac_string("ISO-8859-1", "été", strlen("été"), &out, &out_length)) {
          perror("unac_string");
       } else {
          printf("%.*s0, out_length, out);
          free(out);
       }

IMPLEMENTATION NOTES

       The  endianness  of the UTF-16 strings manipulated by unac must always be big endian. When using iconv(3)
       to translate strings, UTF-16BE should be used instead of UTF-16 to make sure it is big  endian  (BE).  On
       some systems where UTF-16BE is not available, unac will rely on UTF-16 and hope it is properly big endian
       encoded.   For more information check RFC2781 (http://www.faqs.org/rfcs/rfc2781.html: UTF-16, an encoding
       of ISO 10646).

       The unac library uses the Unicode database to  map  accented  letters  to  their  unaccented  equivalent.
       Mapping    tables    are    generated    from    the    UnicodeData-4.0.0.txt    file    (as   found   at
       http://www.unicode.org/Public/4.0-Update/) by the builder perl script. The builder script  inserts  these
       tables  in  the  unac.h  and  unac.c  files,  replacing  the existing ones. Looking for the 'Generated by
       builder' string in the unac.[ch] files allows it to spot the various parts handled by the builder script.

       Some desirable decompositions may not be included in the UnicodeData file, such as AE. To complement  the
       standard  decompositions for the purpose of the unac library, the unaccent-local-map.perl script is used.
       It maps character names (such as LATIN SMALL LETTER AE) to an array of character names into which it will
       be decomposed.  This script is used by the builder script and has  precedence  over  decomposition  rules
       defined in the Unicode data file.

       The  library  data occupies 30KB where a simple minded table would occupy around 512Kbytes. The idea used
       to compress the tables is that many Unicode characters do not have  unaccented  equivalent.   Instead  of
       relying  on  a  table  mapping  each  Unicode  character  to  the  corresponding unaccented character, an
       intermediate array of pointers is created. In the drawing below, the range of  UTF-16  character  is  not
       accurate  but  illustrates  the  method.  The unac_data_table points to a set of unac_dataXX arrays. Each
       pointer covers a range of UTF-16 characters (4 in the example below). When a range of character does  not
       contain any accented character, unac_data_table always points to the same array : unac_data0. Since there
       are many characters without accents, this is enough to achieve a good compression.

             unac_data15                                   unac_data16
       [ NULL, NULL, NULL, e ] <----       /------> [ a, NULL, NULL, NULL ]
                                    |       |
                                    |       |
                                    ^       ^
                 |-----| |-----| |-----| |-----| |-----| |-----|
           [ ... a b c d e f g h i j k é à 0 1 2 3 4 5 6 7 8 9 A... ] unac_data_table
                 |-----| |-----| |-----| |-----| |-----| |-----|
                     v      v                       v       v
                     |      |                       |       |
                     |      |                       |       |
                     --------------------------------------/
                                       |
                                       V
                           [ NULL, NULL, NULL, NULL ]
                                    unac_data0

       Beside  this  simple optimization, a table (unac_positions) listing the actual position of the unaccented
       replacement within a block (unac_dataXX) is  necessary  because  they  are  not  of  fixed  length.  Some
       characters  such  as  æ  will  be replaced by two characters a and e therefore unac_dataXX has a variable
       size.

       The unaccented equivalent of an UTF-16 character is calculated by applying a compatibility  decomposition
       and  then  stripping  all  characters  that belong to the mark category. For a precise definition see the
       Unicode-4.0 normalization forms at http://www.unicode.org/unicode/reports/tr15/.

       All original Unicode data files were taken from http://www.unicode.org/Public and are subject to the  UCD
       Terms of Use.

       http://www.unicode.org/Public/4.0-Update/UCD-4.0.0.html#UCD_Terms

       Disclaimer

       The  Unicode  Character  Database is provided as is by Unicode, Inc. No claims are made as to fitness for
       any particular purpose. No warranties of any kind are expressed  or  implied.  The  recipient  agrees  to
       determine  applicability  of information provided. If this file has been purchased on magnetic or optical
       media from Unicode, Inc., the sole remedy for any claim will be exchange of  defective  media  within  90
       days of receipt.

       This  disclaimer is applicable for all other data files accompanying the Unicode Character Database, some
       of which have been compiled by the Unicode Consortium, and some of which  have  been  supplied  by  other
       sources.

       Limitations on Rights to Redistribute This Data

       Recipient is granted the right to make copies in any form for internal distribution and to freely use the
       information  supplied  in  the  creation  of products supporting the UnicodeTM Standard. The files in the
       Unicode Character Database can be redistributed to third parties  or  other  organizations  (whether  for
       profit  or  not)  as  long  as  this  notice  and  the disclaimer notice are retained. Information can be
       extracted from these files and used in documentation or programs, as long as  there  is  an  accompanying
       notice indicating the source.

       The  file  Unihan.txt  contains older and inconsistent Terms of Use. That language is overridden by these
       terms.

BUGS

       The input string must not contain partially formed characters, there is no support for this case.

       UTF-16 surrogates are not handled.

       Unicode may contain bugs in the decomposition of characters. When you suspect  such  a  bug  on  a  given
       string,  add  a  test  case  with the faulty string in the t_unac.in test script (you will find it in the
       source distribution) and run make check.  It will describe, in a very verbose way,  how  the  string  was
       unaccented.  You  may  then  fix the UnicodeData-4.0.0.txt file and run make check again to make sure the
       problem is solved. Please send such fixes to the author and to the Unicode consortium.

SEE ALSO

       unaccent(1), iconv(3)
       http://www.unicode.org/
       http://oss.software.ibm.com/icu/
       http://www.gnu.org/manual/glibc-2.2.5/libc.html

AUTHOR

       Loic Dachary loic@senga.org
       http://www.senga.org/unac/

                                                      local                                              unac(3)