FreeTDS API
|
Convert between different charsets. More...
Macros | |
#define | CHUNK_ALLOC 4 |
Typedefs | |
typedef uint32_t | ICONV_CHAR |
typedef int(* | iconv_get_t) (const unsigned char *p, size_t len, ICONV_CHAR *out) |
typedef int(* | iconv_put_t) (unsigned char *buf, size_t buf_len, ICONV_CHAR c) |
Enumerations | |
enum | ICONV_CD_VALUE { Like_to_Like = 0x100 } |
Functions | |
static void | _iconv_close (iconv_t *cd) |
static int | collate2charset (TDSCONNECTION *conn, TDS_UCHAR collate[5]) |
static int | get_ascii (const unsigned char *p, size_t len TDS_UNUSED, ICONV_CHAR *out) |
static int | get_cp1252 (const unsigned char *p, size_t len TDS_UNUSED, ICONV_CHAR *out) |
static int | get_err (const unsigned char *p TDS_UNUSED, size_t len TDS_UNUSED, ICONV_CHAR *out TDS_UNUSED) |
static int | get_iso1 (const unsigned char *p, size_t len TDS_UNUSED, ICONV_CHAR *out) |
static int | get_ucs4be (const unsigned char *p, size_t len, ICONV_CHAR *out) |
static int | get_ucs4le (const unsigned char *p, size_t len, ICONV_CHAR *out) |
static int | get_utf16be (const unsigned char *p, size_t len, ICONV_CHAR *out) |
static int | get_utf16le (const unsigned char *p, size_t len, ICONV_CHAR *out) |
static int | get_utf8 (const unsigned char *p, size_t len, ICONV_CHAR *out) |
static int | put_ascii (unsigned char *buf, size_t buf_len, ICONV_CHAR c) |
static int | put_cp1252 (unsigned char *buf, size_t buf_len, ICONV_CHAR c) |
static int | put_err (unsigned char *buf TDS_UNUSED, size_t buf_len TDS_UNUSED, ICONV_CHAR c TDS_UNUSED) |
static int | put_iso1 (unsigned char *buf, size_t buf_len, ICONV_CHAR c) |
static int | put_ucs4be (unsigned char *buf, size_t buf_len, ICONV_CHAR c) |
static int | put_ucs4le (unsigned char *buf, size_t buf_len, ICONV_CHAR c) |
static int | put_utf16be (unsigned char *buf, size_t buf_len, ICONV_CHAR c) |
static int | put_utf16le (unsigned char *buf, size_t buf_len, ICONV_CHAR c) |
static int | put_utf8 (unsigned char *buf, size_t buf_len, ICONV_CHAR c) |
static size_t | skip_one_input_sequence (iconv_t cd, const TDS_ENCODING *charset, const char **input, size_t *input_size) |
Move the input sequence pointer to the next valid position. | |
void | tds7_srv_charset_changed (TDSCONNECTION *conn, TDS_UCHAR collation[5]) |
int | tds_canonical_charset (const char *charset_name) |
Determine canonical iconv character set. | |
const char * | tds_canonical_charset_name (const char *charset_name) |
Determine canonical iconv character set name. | |
size_t | tds_iconv (TDSSOCKET *tds, TDSICONV *conv, TDS_ICONV_DIRECTION io, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) |
Wrapper around iconv(3). | |
void | tds_iconv_close (TDSCONNECTION *conn) |
static void | tds_iconv_err (TDSSOCKET *tds, int err) |
void | tds_iconv_free (TDSCONNECTION *conn) |
TDSICONV * | tds_iconv_from_collate (TDSCONNECTION *conn, TDS_UCHAR collate[5]) |
Get iconv information from a LCID (to support different column encoding under MSSQL2K) | |
TDSICONV * | tds_iconv_get (TDSCONNECTION *conn, const char *client_charset, const char *server_charset) |
TDSICONV * | tds_iconv_get_info (TDSCONNECTION *conn, int canonic_client, int canonic_server) |
Get a iconv info structure, allocate and initialize if needed. | |
static void | tds_iconv_info_close (TDSICONV *char_conv) |
static int | tds_iconv_info_init (TDSICONV *char_conv, int client_canonical, int server_canonical) |
Open iconv descriptors to convert between character sets (both directions). | |
TDSRET | tds_iconv_open (TDSCONNECTION *conn, const char *charset, int use_utf16) |
void | tds_srv_charset_changed (TDSCONNECTION *conn, const char *charset) |
static void | tds_srv_charset_changed_num (TDSCONNECTION *conn, int canonic_charset_num) |
size_t | tds_sys_iconv (iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) |
int | tds_sys_iconv_close (iconv_t cd TDS_UNUSED) |
iconv_t | tds_sys_iconv_open (const char *tocode, const char *fromcode) |
Inputs are FreeTDS canonical names, no other. | |
Variables | |
static const iconv_get_t | iconv_gets [16] |
static const iconv_put_t | iconv_puts [16] |
Convert between different charsets.
Set up the initial iconv conversion descriptors.
When the socket is allocated, three TDSICONV structures are attached to iconv.
They have fixed meanings:
Other designs that use less data are possible, but these three conversion needs are very often needed. By reserving them, we avoid searching the array for our most common purposes.
To solve different iconv names and portability problems FreeTDS maintains a list of aliases each charset.
First we discover the names of our minimum required charsets (UTF-8, ISO8859-1 and UCS2).
Later, as and when it's needed, we try to discover others.
There is one list of canonic names (GNU iconv names) and two sets of aliases (one for other iconv implementations and another for Sybase). For every canonic charset name we cache the iconv name found during discovery.
|
static |
Move the input sequence pointer to the next valid position.
Used when an input character cannot be converted.
int tds_canonical_charset | ( | const char * | charset_name | ) |
Determine canonical iconv character set.
const char * tds_canonical_charset_name | ( | const char * | charset_name | ) |
Determine canonical iconv character set name.
size_t tds_iconv | ( | TDSSOCKET * | tds, |
TDSICONV * | conv, | ||
TDS_ICONV_DIRECTION | io, | ||
const char ** | inbuf, | ||
size_t * | inbytesleft, | ||
char ** | outbuf, | ||
size_t * | outbytesleft | ||
) |
Wrapper around iconv(3).
Same parameters, with slightly different behavior.
tds | state information for the socket and the TDS protocol |
io | Enumerated value indicating whether the data are being sent to or received from the server. |
conv | information about the encodings involved, including the iconv(3) conversion descriptors. |
inbuf | address of pointer to the input buffer of data to be converted. |
inbytesleft | address of count of bytes in inbuf. |
outbuf | address of pointer to the output buffer. |
outbytesleft | address of count of bytes in outbuf. |
number | of irreversible conversions performed. -1 on error, see iconv(3) documentation for a description of the possible values of errno. |
If a character in inbuf cannot be converted because no such cbaracter exists in the outbuf character set, we emit messages similar to the ones Sybase emits when it fails such a conversion. The message varies depending on the direction of the data.
On a read error, we emit Msg 2403, Severity 16 (EX_INFO): "WARNING! Some character(s) could not be converted into client's character set.
Unconverted bytes were changed to question marks ('?')." On a write error we emit Msg 2402, Severity 16 (EX_USER): "Error converting client characters into server's character set. Some character(s) could not be converted." and return an error code. Client libraries relying on this routine should reflect an error back to the application.
Check for variable multibyte non-UTF-8 input character set.
Use more robust error message generation.
For reads, cope with outbuf encodings that don't have the equivalent of an ASCII '?'.
Support alternative to '?' for the replacement character.
|
static |
Open iconv descriptors to convert between character sets (both directions).
iconv_t tds_sys_iconv_open | ( | const char * | tocode, |
const char * | fromcode | ||
) |
Inputs are FreeTDS canonical names, no other.
No alias list is consulted.
|
static |
|
static |