diff --git a/Makefile.am b/Makefile.am index 4f32caca..cfb0333c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,7 +2,7 @@ # have all needed files, that a GNU package needs AUTOMAKE_OPTIONS = foreign 1.4 -SUBDIRS = src data doc +SUBDIRS = src doc docdir = $(prefix)/share/doc/$(PACKAGE) doc_DATA = AUTHORS NEWS COPYING EXTRA_DIST = $(doc_DATA) diff --git a/configure.in b/configure.in index b6451b1e..ebf8aedd 100644 --- a/configure.in +++ b/configure.in @@ -38,7 +38,6 @@ if test "$prefix" = "NONE"; then else encodings_file="${prefix}" fi -AC_DEFINE_UNQUOTED([ENCODINGS], ["${encodings_file}/share/ncmpcpp/encodings"], [defines path for encodings file]) AC_CHECK_HEADERS([iconv.h], , AC_MSG_NOTICE(cannot find iconv.h header, iconv support will be disabled)) dnl ======================== @@ -103,5 +102,5 @@ if test "$taglib" = "yes" ; then fi fi -AC_CONFIG_FILES([Makefile src/Makefile data/Makefile doc/Makefile]) +AC_CONFIG_FILES([Makefile src/Makefile doc/Makefile]) AC_OUTPUT diff --git a/data/Makefile.am b/data/Makefile.am deleted file mode 100644 index 4fa334a2..00000000 --- a/data/Makefile.am +++ /dev/null @@ -1,2 +0,0 @@ -pkgdata_DATA = encodings -EXTRA_DIST = $(pkgdata_DATA) diff --git a/data/encodings b/data/encodings deleted file mode 100644 index 06192718..00000000 --- a/data/encodings +++ /dev/null @@ -1,411 +0,0 @@ -aa_DJ.UTF-8 UTF-8 -aa_DJ ISO-8859-1 -aa_ER UTF-8 -aa_ER@saaho UTF-8 -aa_ET UTF-8 -af_ZA.UTF-8 UTF-8 -af_ZA ISO-8859-1 -am_ET UTF-8 -an_ES.UTF-8 UTF-8 -an_ES ISO-8859-15 -ar_AE.UTF-8 UTF-8 -ar_AE ISO-8859-6 -ar_BH.UTF-8 UTF-8 -ar_BH ISO-8859-6 -ar_DZ.UTF-8 UTF-8 -ar_DZ ISO-8859-6 -ar_EG.UTF-8 UTF-8 -ar_EG ISO-8859-6 -ar_IN UTF-8 -ar_IQ.UTF-8 UTF-8 -ar_IQ ISO-8859-6 -ar_JO.UTF-8 UTF-8 -ar_JO ISO-8859-6 -ar_KW.UTF-8 UTF-8 -ar_KW ISO-8859-6 -ar_LB.UTF-8 UTF-8 -ar_LB ISO-8859-6 -ar_LY.UTF-8 UTF-8 -ar_LY ISO-8859-6 -ar_MA.UTF-8 UTF-8 -ar_MA ISO-8859-6 -ar_OM.UTF-8 UTF-8 -ar_OM ISO-8859-6 -ar_QA.UTF-8 UTF-8 -ar_QA ISO-8859-6 -ar_SA.UTF-8 UTF-8 -ar_SA ISO-8859-6 -ar_SD.UTF-8 UTF-8 -ar_SD ISO-8859-6 -ar_SY.UTF-8 UTF-8 -ar_SY ISO-8859-6 -ar_TN.UTF-8 UTF-8 -ar_TN ISO-8859-6 -ar_YE.UTF-8 UTF-8 -ar_YE ISO-8859-6 -az_AZ.UTF-8 UTF-8 -as_IN.UTF-8 UTF-8 -ast_ES.UTF-8 UTF-8 -ast_ES ISO-8859-15 -be_BY.UTF-8 UTF-8 -be_BY CP1251 -be_BY@latin UTF-8 -ber_DZ UTF-8 -ber_MA UTF-8 -bg_BG.UTF-8 UTF-8 -bg_BG CP1251 -bn_BD UTF-8 -bn_IN UTF-8 -bo_CN UTF-8 -bo_IN UTF-8 -br_FR.UTF-8 UTF-8 -br_FR ISO-8859-1 -br_FR@euro ISO-8859-15 -bs_BA.UTF-8 UTF-8 -bs_BA ISO-8859-2 -byn_ER UTF-8 -ca_AD.UTF-8 UTF-8 -ca_AD ISO-8859-15 -ca_ES.UTF-8 UTF-8 -ca_ES ISO-8859-1 -ca_ES@euro ISO-8859-15 -ca_ES.UTF-8@valencia UTF-8 -ca_ES@valencia ISO-8859-15 -ca_FR.UTF-8 UTF-8 -ca_FR ISO-8859-15 -ca_IT.UTF-8 UTF-8 -ca_IT ISO-8859-15 -crh_UA UTF-8 -cs_CZ.UTF-8 UTF-8 -cs_CZ ISO-8859-2 -csb_PL UTF-8 -cy_GB.UTF-8 UTF-8 -cy_GB ISO-8859-14 -da_DK.UTF-8 UTF-8 -da_DK ISO-8859-1 -de_AT.UTF-8 UTF-8 -de_AT ISO-8859-1 -de_AT@euro ISO-8859-15 -de_BE.UTF-8 UTF-8 -de_BE ISO-8859-1 -de_BE@euro ISO-8859-15 -de_CH.UTF-8 UTF-8 -de_CH ISO-8859-1 -de_DE.UTF-8 UTF-8 -de_DE ISO-8859-1 -de_DE@euro ISO-8859-15 -de_LU.UTF-8 UTF-8 -de_LU ISO-8859-1 -de_LU@euro ISO-8859-15 -dz_BT UTF-8 -el_GR.UTF-8 UTF-8 -el_GR ISO-8859-7 -el_CY.UTF-8 UTF-8 -el_CY ISO-8859-7 -en_AG UTF-8 -en_AU.UTF-8 UTF-8 -en_AU ISO-8859-1 -en_BW.UTF-8 UTF-8 -en_BW ISO-8859-1 -en_CA.UTF-8 UTF-8 -en_CA ISO-8859-1 -en_DK.UTF-8 UTF-8 -en_DK ISO-8859-1 -en_GB.UTF-8 UTF-8 -en_GB ISO-8859-1 -en_HK.UTF-8 UTF-8 -en_HK ISO-8859-1 -en_IE.UTF-8 UTF-8 -en_IE ISO-8859-1 -en_IE@euro ISO-8859-15 -en_IN UTF-8 -en_NG UTF-8 -en_NZ.UTF-8 UTF-8 -en_NZ ISO-8859-1 -en_PH.UTF-8 UTF-8 -en_PH ISO-8859-1 -en_SG.UTF-8 UTF-8 -en_SG ISO-8859-1 -en_US.UTF-8 UTF-8 -en_US ISO-8859-1 -en_ZA.UTF-8 UTF-8 -en_ZA ISO-8859-1 -en_ZW.UTF-8 UTF-8 -en_ZW ISO-8859-1 -es_AR.UTF-8 UTF-8 -es_AR ISO-8859-1 -es_BO.UTF-8 UTF-8 -es_BO ISO-8859-1 -es_CL.UTF-8 UTF-8 -es_CL ISO-8859-1 -es_CO.UTF-8 UTF-8 -es_CO ISO-8859-1 -es_CR.UTF-8 UTF-8 -es_CR ISO-8859-1 -es_DO.UTF-8 UTF-8 -es_DO ISO-8859-1 -es_EC.UTF-8 UTF-8 -es_EC ISO-8859-1 -es_ES.UTF-8 UTF-8 -es_ES ISO-8859-1 -es_ES@euro ISO-8859-15 -es_GT.UTF-8 UTF-8 -es_GT ISO-8859-1 -es_HN.UTF-8 UTF-8 -es_HN ISO-8859-1 -es_MX.UTF-8 UTF-8 -es_MX ISO-8859-1 -es_NI.UTF-8 UTF-8 -es_NI ISO-8859-1 -es_PA.UTF-8 UTF-8 -es_PA ISO-8859-1 -es_PE.UTF-8 UTF-8 -es_PE ISO-8859-1 -es_PR.UTF-8 UTF-8 -es_PR ISO-8859-1 -es_PY.UTF-8 UTF-8 -es_PY ISO-8859-1 -es_SV.UTF-8 UTF-8 -es_SV ISO-8859-1 -es_US.UTF-8 UTF-8 -es_US ISO-8859-1 -es_UY.UTF-8 UTF-8 -es_UY ISO-8859-1 -es_VE.UTF-8 UTF-8 -es_VE ISO-8859-1 -et_EE.UTF-8 UTF-8 -et_EE ISO-8859-1 -et_EE.ISO-8859-15 ISO-8859-15 -eu_ES.UTF-8 UTF-8 -eu_ES ISO-8859-1 -eu_ES@euro ISO-8859-15 -fa_IR UTF-8 -fi_FI.UTF-8 UTF-8 -fi_FI ISO-8859-1 -fi_FI@euro ISO-8859-15 -fil_PH UTF-8 -fo_FO.UTF-8 UTF-8 -fo_FO ISO-8859-1 -fr_BE.UTF-8 UTF-8 -fr_BE ISO-8859-1 -fr_BE@euro ISO-8859-15 -fr_CA.UTF-8 UTF-8 -fr_CA ISO-8859-1 -fr_CH.UTF-8 UTF-8 -fr_CH ISO-8859-1 -fr_FR.UTF-8 UTF-8 -fr_FR ISO-8859-1 -fr_FR@euro ISO-8859-15 -fr_LU.UTF-8 UTF-8 -fr_LU ISO-8859-1 -fr_LU@euro ISO-8859-15 -fur_IT UTF-8 -fy_NL UTF-8 -fy_DE UTF-8 -ga_IE.UTF-8 UTF-8 -ga_IE ISO-8859-1 -ga_IE@euro ISO-8859-15 -gd_GB.UTF-8 UTF-8 -gd_GB ISO-8859-15 -gez_ER UTF-8 -gez_ER@abegede UTF-8 -gez_ET UTF-8 -gez_ET@abegede UTF-8 -gl_ES.UTF-8 UTF-8 -gl_ES ISO-8859-1 -gl_ES@euro ISO-8859-15 -gu_IN UTF-8 -gv_GB.UTF-8 UTF-8 -gv_GB ISO-8859-1 -ha_NG UTF-8 -he_IL.UTF-8 UTF-8 -he_IL ISO-8859-8 -hi_IN UTF-8 -hr_HR.UTF-8 UTF-8 -hr_HR ISO-8859-2 -hsb_DE ISO-8859-2 -hsb_DE.UTF-8 UTF-8 -ht_HT UTF-8 -hu_HU.UTF-8 UTF-8 -hu_HU ISO-8859-2 -hy_AM UTF-8 -hy_AM.ARMSCII-8 ARMSCII-8 -id_ID.UTF-8 UTF-8 -id_ID ISO-8859-1 -ig_NG UTF-8 -ik_CA UTF-8 -is_IS.UTF-8 UTF-8 -is_IS ISO-8859-1 -it_CH.UTF-8 UTF-8 -it_CH ISO-8859-1 -it_IT.UTF-8 UTF-8 -it_IT ISO-8859-1 -it_IT@euro ISO-8859-15 -iu_CA UTF-8 -iw_IL.UTF-8 UTF-8 -iw_IL ISO-8859-8 -ja_JP.EUC-JP EUC-JP -ja_JP.UTF-8 UTF-8 -ka_GE.UTF-8 UTF-8 -ka_GE GEORGIAN-PS -kk_KZ.UTF-8 UTF-8 -kk_KZ PT154 -kl_GL.UTF-8 UTF-8 -kl_GL ISO-8859-1 -km_KH UTF-8 -kn_IN UTF-8 -ko_KR.EUC-KR EUC-KR -ko_KR.UTF-8 UTF-8 -ks_IN@devanagari UTF-8 -ku_TR.UTF-8 UTF-8 -ku_TR ISO-8859-9 -kw_GB.UTF-8 UTF-8 -kw_GB ISO-8859-1 -ky_KG UTF-8 -lg_UG.UTF-8 UTF-8 -lg_UG ISO-8859-10 -li_BE UTF-8 -li_NL UTF-8 -lo_LA UTF-8 -lt_LT.UTF-8 UTF-8 -lt_LT ISO-8859-13 -lv_LV.UTF-8 UTF-8 -lv_LV ISO-8859-13 -mai_IN UTF-8 -mg_MG.UTF-8 UTF-8 -mg_MG ISO-8859-15 -mi_NZ.UTF-8 UTF-8 -mi_NZ ISO-8859-13 -mk_MK.UTF-8 UTF-8 -mk_MK ISO-8859-5 -ml_IN UTF-8 -mn_MN UTF-8 -mr_IN UTF-8 -ms_MY.UTF-8 UTF-8 -ms_MY ISO-8859-1 -mt_MT.UTF-8 UTF-8 -mt_MT ISO-8859-3 -nb_NO.UTF-8 UTF-8 -nb_NO ISO-8859-1 -nds_DE UTF-8 -nds_NL UTF-8 -ne_NP UTF-8 -nl_AW UTF-8 -nl_BE.UTF-8 UTF-8 -nl_BE ISO-8859-1 -nl_BE@euro ISO-8859-15 -nl_NL.UTF-8 UTF-8 -nl_NL ISO-8859-1 -nl_NL@euro ISO-8859-15 -nn_NO.UTF-8 UTF-8 -nn_NO ISO-8859-1 -nr_ZA UTF-8 -nso_ZA UTF-8 -oc_FR.UTF-8 UTF-8 -oc_FR ISO-8859-1 -om_ET UTF-8 -om_KE.UTF-8 UTF-8 -om_KE ISO-8859-1 -or_IN UTF-8 -pa_IN UTF-8 -pa_PK UTF-8 -pap_AN UTF-8 -pl_PL.UTF-8 UTF-8 -pl_PL ISO-8859-2 -pt_BR.UTF-8 UTF-8 -pt_BR ISO-8859-1 -pt_PT.UTF-8 UTF-8 -pt_PT ISO-8859-1 -pt_PT@euro ISO-8859-15 -ro_RO.UTF-8 UTF-8 -ro_RO ISO-8859-2 -ru_RU.KOI8-R KOI8-R -ru_RU.UTF-8 UTF-8 -ru_RU ISO-8859-5 -ru_UA.UTF-8 UTF-8 -ru_UA KOI8-U -rw_RW UTF-8 -sa_IN UTF-8 -sc_IT UTF-8 -sd_IN UTF-8 -sd_IN@devanagari UTF-8 -se_NO UTF-8 -shs_CA UTF-8 -si_LK UTF-8 -sid_ET UTF-8 -sk_SK.UTF-8 UTF-8 -sk_SK ISO-8859-2 -sl_SI.UTF-8 UTF-8 -sl_SI ISO-8859-2 -so_DJ.UTF-8 UTF-8 -so_DJ ISO-8859-1 -so_ET UTF-8 -so_KE.UTF-8 UTF-8 -so_KE ISO-8859-1 -so_SO.UTF-8 UTF-8 -so_SO ISO-8859-1 -sq_AL.UTF-8 UTF-8 -sq_AL ISO-8859-1 -sr_ME UTF-8 -sr_RS UTF-8 -sr_RS@latin UTF-8 -ss_ZA UTF-8 -st_ZA.UTF-8 UTF-8 -st_ZA ISO-8859-1 -sv_FI.UTF-8 UTF-8 -sv_FI ISO-8859-1 -sv_FI@euro ISO-8859-15 -sv_SE.UTF-8 UTF-8 -sv_SE ISO-8859-1 -ta_IN UTF-8 -te_IN UTF-8 -tg_TJ.UTF-8 UTF-8 -tg_TJ KOI8-T -th_TH.UTF-8 UTF-8 -th_TH TIS-620 -ti_ER UTF-8 -ti_ET UTF-8 -tig_ER UTF-8 -tk_TM UTF-8 -tl_PH.UTF-8 UTF-8 -tl_PH ISO-8859-1 -tn_ZA UTF-8 -tr_CY.UTF-8 UTF-8 -tr_CY ISO-8859-9 -tr_TR.UTF-8 UTF-8 -tr_TR ISO-8859-9 -ts_ZA UTF-8 -tt_RU.UTF-8 UTF-8 -tt_RU@iqtelif.UTF-8 UTF-8 -ug_CN UTF-8 -uk_UA.UTF-8 UTF-8 -uk_UA KOI8-U -ur_PK UTF-8 -uz_UZ ISO-8859-1 -uz_UZ@cyrillic UTF-8 -ve_ZA UTF-8 -vi_VN.TCVN TCVN5712-1 -vi_VN UTF-8 -wa_BE ISO-8859-1 -wa_BE@euro ISO-8859-15 -wa_BE.UTF-8 UTF-8 -wo_SN UTF-8 -xh_ZA.UTF-8 UTF-8 -xh_ZA ISO-8859-1 -yi_US.UTF-8 UTF-8 -yi_US CP1255 -yo_NG UTF-8 -zh_CN.GB18030 GB18030 -zh_CN.GBK GBK -zh_CN.UTF-8 UTF-8 -zh_CN GB2312 -zh_HK.UTF-8 UTF-8 -zh_HK BIG5-HKSCS -zh_SG.UTF-8 UTF-8 -zh_SG.GBK GBK -zh_SG GB2312 -zh_TW.EUC-TW EUC-TW -zh_TW.UTF-8 UTF-8 -zh_TW BIG5 -zu_ZA.UTF-8 UTF-8 -zu_ZA ISO-8859-1 diff --git a/doc/config b/doc/config index c86d5782..d079c221 100644 --- a/doc/config +++ b/doc/config @@ -17,6 +17,14 @@ # #mpd_crossfade_time = "5" # +##### system encoding ##### +## +## if you use encoding other than utf8, set it in +## order to handle utf8 encoded strings properly. +## +# +#system_encoding = "" +# ##### delays ##### # ## delay after playlist highlighting will be disabled (0 = don't disable) diff --git a/doc/ncmpcpp.1 b/doc/ncmpcpp.1 index b881c857..829cefd7 100644 --- a/doc/ncmpcpp.1 +++ b/doc/ncmpcpp.1 @@ -60,6 +60,9 @@ Set connection timeout to MPD to given value. .B mpd_crossfade_time = SECONDS Default number of seconds to crossfade, if enabled by ncmpcpp. .TP +.B system_encoding = ENCODING +If you use encoding other than utf8, set it in order to handle utf8 encoded strings properly. +.TP .B seek_time = SECONDS Base seek time to begin with. .TP diff --git a/src/charset.cpp b/src/charset.cpp index 170a1f52..fa683f2c 100644 --- a/src/charset.cpp +++ b/src/charset.cpp @@ -29,13 +29,11 @@ #include #include -#include "locale.h" +#include "settings.h" #include "str_pool.h" namespace { - char *locale_charset = 0; - inline bool char_non_ascii(char ch) { return (ch & 0x80) != 0; @@ -89,55 +87,12 @@ namespace } } -void init_current_locale() -{ - if (!setlocale(LC_CTYPE, "")) - return; - std::string envlocale = setlocale(LC_CTYPE, ""); - if (envlocale.empty() || envlocale == "C") - return; - std::ifstream f(ENCODINGS); - if (!f.is_open()) - { - std::cerr << "ncmpcpp: cannot open file "ENCODINGS"!\n"; - return; - } - envlocale += " "; - std::string line; - while (!f.eof()) - { - getline(f, line); - if (line.find(envlocale) != std::string::npos) - { - try - { - std::string charset = line.substr(line.find(" ")+1); - if (charset == "UTF-8" - || charset == "utf-8" - || charset == "utf8") - { - f.close(); - return; - } - locale_charset = strdup((charset + "//TRANSLIT").c_str()); - } - catch (std::out_of_range) - { - f.close(); - return; - } - break; - } - } - f.close(); -} - void utf_to_locale(std::string &s) { - if (s.empty() || !locale_charset || !has_non_ascii_chars(s)) + if (s.empty() || Config.system_encoding.empty() || !has_non_ascii_chars(s)) return; char *tmp = str_pool_get(s.c_str()); - charset_convert("utf8", locale_charset, tmp, s.length()); + charset_convert("utf8", Config.system_encoding.c_str(), tmp, s.length()); s = tmp; str_pool_put(tmp); } @@ -151,10 +106,10 @@ std::string utf_to_locale_cpy(const std::string &s) void locale_to_utf(std::string &s) { - if (s.empty() || !locale_charset || !has_non_ascii_chars(s)) + if (s.empty() || Config.system_encoding.empty() || !has_non_ascii_chars(s)) return; char *tmp = str_pool_get(s.c_str()); - charset_convert(locale_charset, "utf8", tmp, s.length()); + charset_convert(Config.system_encoding.c_str(), "utf8", tmp, s.length()); s = tmp; str_pool_put(tmp); } @@ -168,16 +123,16 @@ std::string locale_to_utf_cpy(const std::string &s) void str_pool_utf_to_locale(char *&s) { - if (!s || !locale_charset || !has_non_ascii_chars(s)) + if (!s || Config.system_encoding.empty() || !has_non_ascii_chars(s)) return; - charset_convert("utf8", locale_charset, s); + charset_convert("utf8", Config.system_encoding.c_str(), s); } void str_pool_locale_to_utf(char *&s) { - if (!s || !locale_charset || !has_non_ascii_chars(s)) + if (!s || Config.system_encoding.empty() || !has_non_ascii_chars(s)) return; - charset_convert(locale_charset, "utf8", s); + charset_convert(Config.system_encoding.c_str(), "utf8", s); } #endif // HAVE_ICONV_H diff --git a/src/charset.h b/src/charset.h index d5cf3652..3f195d41 100644 --- a/src/charset.h +++ b/src/charset.h @@ -29,8 +29,6 @@ #include -void init_current_locale(); - void utf_to_locale(std::string &); void locale_to_utf(std::string &); @@ -42,8 +40,6 @@ void str_pool_locale_to_utf(char *&); #else -#define init_current_locale(); - #define utf_to_locale(x); #define locale_to_utf(x); diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index 9efd2023..433c668c 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -118,7 +118,6 @@ int main(int argc, char *argv[]) std::cerr.rdbuf(errorlog.rdbuf()); InitScreen("ncmpc++ ver. "VERSION, Config.colors_enabled); - init_current_locale(); MainStartY = 2; MainHeight = LINES-4; diff --git a/src/settings.cpp b/src/settings.cpp index 6d736709..fa9ff039 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -528,6 +528,11 @@ void ReadConfiguration(ncmpcpp_config &conf) if (!v.empty()) conf.external_editor = v; } + else if (cl.find("system_encoding") != string::npos) + { + if (!v.empty()) + conf.system_encoding = v + "//TRANSLIT"; + } else if (cl.find("browser_playlist_prefix") != string::npos) { if (!v.empty()) diff --git a/src/settings.h b/src/settings.h index 01a9df29..b2a49e28 100644 --- a/src/settings.h +++ b/src/settings.h @@ -111,6 +111,7 @@ struct ncmpcpp_config std::string song_library_format; std::string tag_editor_album_format; std::string external_editor; + std::string system_encoding; std::string pattern;