diff --git a/docs/help/in/recode.in b/docs/help/in/recode.in index 510fc825..2ab2fb1b 100644 --- a/docs/help/in/recode.in +++ b/docs/help/in/recode.in @@ -4,14 +4,15 @@ RECODE %|List the conversion database -RECODE ADD %|[[/]] - %|Add an entry to the conversion database (if target is omitted, - the current channel or query will be used). You can specify the - to have different charsets for the same for - different networks. +RECODE ADD %||[/]] + %|Add an entry to the conversion database (if tag or target is + omitted, the current channel or query will be used). You can specify + the to have different charsets for the same for + different networks. You can omit the target, and specify only the tag + if you want to add an entry for the network. -RECODE REMOVE %|[] - %|Remove an entry from the conversion database (if target is +RECODE REMOVE %|[|] + %|Remove an entry from the conversion database (if tag or target is omitted, the current channel or query will be used) To specify your local charset you have to set term_charset diff --git a/src/core/recode.c b/src/core/recode.c index 353d8ed2..b3668ed0 100644 --- a/src/core/recode.c +++ b/src/core/recode.c @@ -87,23 +87,27 @@ char *recode_in(const SERVER_REC *server, const char *str, const char *target) str_is_utf8 = g_utf8_validate(str, len, NULL); translit = settings_get_bool("recode_transliterate"); - + if (server != NULL) tagtarget = server->tag == NULL ? NULL : g_strdup_printf("%s/%s", server->tag, target); if (tagtarget != NULL) from = iconfig_get_str("conversions", tagtarget, NULL); g_free(tagtarget); + if (target != NULL && from == NULL) from = iconfig_get_str("conversions", target, NULL); + if (from == NULL) + from = iconfig_get_str("conversions", server->tag, NULL); + term_is_utf8 = recode_get_charset(&to); if (translit && !is_translit(to)) to = translit_to = g_strconcat(to, "//TRANSLIT", NULL); if (from) - recoded = g_convert(str, len, to, from, NULL, NULL, NULL); + recoded = g_convert_with_fallback(str, len, to, from, NULL, NULL, NULL); if (!recoded) { if (term_is_utf8) { @@ -114,7 +118,7 @@ char *recode_in(const SERVER_REC *server, const char *str, const char *target) from = "UTF-8"; if (from) - recoded = g_convert(str, len, to, from, NULL, NULL, NULL); + recoded = g_convert_with_fallback(str, len, to, from, NULL, NULL, NULL); if (!recoded) recoded = g_strdup(str); @@ -158,6 +162,8 @@ char *recode_out(const SERVER_REC *server, const char *str, const char *target) g_free(tagtarget); if (to == NULL || *to == '\0') to = iconfig_get_str("conversions", target, NULL); + if (to == NULL || *to == '\0') + to = iconfig_get_str("conversions", server->tag, NULL); if (to == NULL || *to == '\0') /* default outgoing charset if set */ to = settings_get_str("recode_out_default_charset");