diff --git a/src/libpspp/i18n.c b/src/libpspp/i18n.c index f8e5e39..91db05c 100644 --- a/src/libpspp/i18n.c +++ b/src/libpspp/i18n.c @@ -61,6 +61,19 @@ create_iconv (const char* tocode, const char* fromcode) return conv; } +static void +dump_char_array (FILE *fp, const char *file, int line, + const char *text, int length) +{ + int i; + fprintf (fp, "%s:%d ", file, line); + for (i = 0; i < length; ++i) + { + fprintf (fp, "(0x%02x) ", (unsigned char) text[i]); + } + fprintf (fp, "\n"); +} + /* Return a string based on TEXT converted according to HOW. If length is not -1, then it must be the number of bytes in TEXT. The returned string must be freed when no longer required. @@ -86,6 +99,9 @@ recode_string (enum conv_id how, const char *text, int length) assert (how < n_CONV); + fprintf (stderr, "%s:%d Convertor %d\n", __FILE__, __LINE__, how); + dump_char_array (stderr, __FILE__, __LINE__, text, length); + if (convertor[how] == (iconv_t) -1) return xstrndup (text, length); @@ -148,6 +164,8 @@ recode_string (enum conv_id how, const char *text, int length) *op = '\0'; + dump_char_array (stderr, __FILE__, __LINE__, outbuf, strlen (outbuf)); + return outbuf; } @@ -202,6 +220,8 @@ i18n_init (void) free (charset); charset = strdup (locale_charset ()); + fprintf (stderr, "%s:%d Charset is \"%s\"\n", __FILE__, __LINE__, charset); + convertor[CONV_PSPP_TO_UTF8] = create_iconv ("UTF-8", charset); convertor[CONV_SYSTEM_TO_PSPP] = create_iconv (charset, charset); convertor[CONV_UTF8_TO_PSPP] = create_iconv (charset, "UTF-8"); diff --git a/src/ui/gui/helper.c b/src/ui/gui/helper.c index 49dbfda..83319c4 100644 --- a/src/ui/gui/helper.c +++ b/src/ui/gui/helper.c @@ -160,6 +160,13 @@ pspp_locale_to_utf8 (const gchar *text, gssize len, GError **err) return recode_string (CONV_PSPP_TO_UTF8, text, len); } +gchar * +utf8_to_pspp_locale (const gchar *text, gssize len, GError **err) +{ + return recode_string (CONV_UTF8_TO_PSPP, text, len); +} + + #define _(msgid) gettext (msgid) #define N_(msgid) msgid diff --git a/src/ui/gui/helper.h b/src/ui/gui/helper.h index 17e777a..ca15a35 100644 --- a/src/ui/gui/helper.h +++ b/src/ui/gui/helper.h @@ -44,7 +44,8 @@ GtkAction * get_action_assert (GtkBuilder *builder, const gchar *name); GtkWidget * get_widget_assert (GtkBuilder *builder, const gchar *name); /* Converts a string in the pspp locale to utf-8 */ -char * pspp_locale_to_utf8 (const gchar *text, gssize len, GError **err); +gchar * pspp_locale_to_utf8 (const gchar *text, gssize len, GError **err); +gchar * utf8_to_pspp_locale (const gchar *text, gssize len, GError **err); void connect_help (GtkBuilder *); diff --git a/src/ui/gui/psppire-data-store.c b/src/ui/gui/psppire-data-store.c index f36fe38..45104f5 100644 --- a/src/ui/gui/psppire-data-store.c +++ b/src/ui/gui/psppire-data-store.c @@ -659,6 +659,7 @@ gboolean psppire_data_store_set_string (PsppireDataStore *store, const gchar *text, glong row, glong col) { + gchar *s; glong n_cases; const struct variable *pv = psppire_dict_get_variable (store->dict, col); if ( NULL == pv) @@ -672,9 +673,12 @@ psppire_data_store_set_string (PsppireDataStore *store, if (row == n_cases) psppire_data_store_insert_new_case (store, row); + s = utf8_to_pspp_locale (text, -1, NULL); + psppire_data_store_data_in (store, row, - var_get_case_index (pv), ss_cstr (text), + var_get_case_index (pv), ss_cstr (s), var_get_write_format (pv)); + free (s); psppire_sheet_model_range_changed (PSPPIRE_SHEET_MODEL (store), row, col, row, col);