/** * Copyright (c) 2009-2010 Mika Laitio * * This file and library is covered by the LGPL version 3, read LICENSE for details. * * History: * - Created charencoding.c on: Nov 25, 2009 */ #include #include #include #include #include #include #include #include "internal/charencoding_internal.h" #include "internal/utf8.h" #define LOCALE_CHARSET_UTF8 "UTF-8" static bool _locale_charset_utf8_check_initialized = false; static bool _locale_is_utf8 = false; bool is_utf8_locale() { const char *locale_charset; if (_locale_charset_utf8_check_initialized == false) { locale_charset = get_locale_charset_alias(); if (strcmp(locale_charset, LOCALE_CHARSET_UTF8) == 0) { _locale_is_utf8 = true; } else { _locale_is_utf8 = false; } _locale_charset_utf8_check_initialized = true; } return _locale_is_utf8; } char *str_encode(const char *src, const char *src_charset, const char *trgt_charset, int *err_flg) { iconv_t conversion_desc; char *ret_val; int cmp_res; size_t src_length; size_t trgt_length; ret_val = NULL; *err_flg = 0; if (src != NULL) { cmp_res = strcasecmp(src_charset, trgt_charset); if ((cmp_res == 0) || (strlen(src) == 0)) { ret_val = strdup(src); if (ret_val == NULL) { *err_flg = ENOMEM; } } else { conversion_desc = iconv_open(trgt_charset, src_charset); if (conversion_desc != (iconv_t)-1) { src_length = strlen(src); trgt_length = 0; ret_val = str_iconv_encode(conversion_desc, src, src_length, &trgt_length, err_flg); if (*err_flg == 0) { *err_flg = iconv_close(conversion_desc); } else { if (ret_val != NULL) { free(ret_val); ret_val = NULL; } } } else { *err_flg = ENOMEM; } } } return ret_val; } char *utf8_encode(char *src, int *err_flg) { const char *charset; char *ret_val; ret_val = NULL; if (src != NULL) { if (is_utf8_locale() == true) { ret_val = strdup(src); } else { charset = get_locale_charset_alias(); ret_val = str_encode(src, charset, LOCALE_CHARSET_UTF8, err_flg); } } return ret_val; } int utf8_printf(char *fmt, ...) { int ret_val; va_list args; va_start(args, fmt); { ret_val = utf8_vprintf(fmt, args); } va_end(args); return ret_val; }