cake
/
libcasio
Archived
1
1
Fork 0
This repository has been archived on 2024-03-16. You can view files and clone it, but cannot push or open issues or pull requests.
libcasio/docs/user/character.rst

99 lines
2.9 KiB
ReStructuredText
Raw Normal View History

Character encoding and conversions
==================================
libcasio has its own portable character encoding conversion, resembling
iconv. It supports Unicode transformation formats (UTF-8, UTF-16, UTF-32)
and CASIO's proprietary character encoding named FONTCHARACTER according to
the SDK it published in 2006 for the fx-9860G.
The character conversion utilities are defined in ``<libcasio/char.h>``,
but as usual, including ``<libcasio.h>`` for everything is recommended.
Opening and closing a conversion descriptor
-------------------------------------------
The conversion descriptor is the main object that will keep track of
the conversion steps and status. Here are the main functions to manage it:
.. c:type:: casio_conv_t
The conversion descriptor type.
.. c:function:: int casio_open_conv(casio_conv_t *cd, char const *to, \
char const *from)
Open the conversion descriptor.
The ``to`` and ``from`` parameters are the string identifiers of the
source and destination encodings for the conversion.
For example, use ``casio_open_conv(&cd, "utf-8", "utf-32")`` to open a
descriptor that will be able to convert UTF-32 encoded data into UTF-8
encoded data.
Converting formats
------------------
Once the conversion descriptor is opened, you can use the following
function:
.. c:function:: int casio_conv(casio_conv_t cd, \
char const **in_buffer, size_t *in_left, \
char **out_buffer, size_t *out_left)
In the same fashion than iconv, this function is made for being called
several times, usually because you read from a stream and write to another
stream — although you can use it to convert data all at once.
Here is a simple example using two buffers:
.. code-block:: c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <libcasio.h>
int main(void)
{
int err = 0; casio_conv_t cd = NULL;
uint32_t buf0[] = {'H', 'e', 'l', 'l', 'o'};
size_t buf0_size = 5 * sizeof(uint32_t);
uint32_t buf1[] = {' ', 'w', 'o', 'r', 'l', 'd', '!'};
size_t buf1_size = 7 * sizeof(uint32_t);
char bufdata[30], *buf = &bufdata;
size_t outsize = 29; /* let space for the end zero */
/* Open the conversion descriptor. */
err = casio_open_conv(&cd, "utf-8", "utf-32");
if (err) {
fprintf(stderr, "Could not open the conversion desc.: %s",
casio_strerror(err));
goto fail;
}
/* Convert the first buffer. */
err = casio_conv(cd, &buf0, &buf0_size, &buf, &outsize);
if (err) {
fprintf(stderr, "Could not convert the first buffer: %s",
casio_strerror(err));
goto fail;
}
/* Convert the second buffer. */
err = casio_conv(cd, &buf1, &buf1_size, &buf, &outsize);
if (err) {
fprintf(stderr, "Could not convert the second buffer: %s",
casio_strerror(err));
goto fail;
}
/* Print the buffer. */
*buf = '\0';
fputs(bufdata, stdout);
fail:
/* Close the conversion descriptor. */
casio_close_conv(cd);
return (err != 0);
}