Hi, all: I am using multisync with my Clie, T68 and Evolution in chinese environment (Debian-sarge), it's just what I am seeking for, but seems that multisync did not deal chinese characters well, after dig into the source code (thanks to GPL), I made two fixes to resolve problems:
1. If properties of key contains charset specification, like 'N;CHARSET=UTF-7:+...", then remove this property and convert its value to UTF-8, because Evolution can process UTF-8 properly even if no charset specified 2. Because UTF-8 use all 8 bits of byte, so escape (in palm plugin) is needn't after convert to UTF-8 or will corrupt the character encoding here is my patch: diff -ur multisync-0.82.orig/src/sync_vtype.c multisync-0.82/src/sync_vtype.c --- multisync-0.82.orig/src/sync_vtype.c 2004-04-13 05:03:29.000000000 +0800 +++ multisync-0.82/src/sync_vtype.c 2004-07-07 22:44:28.000000000 +0800 @@ -61,6 +61,46 @@ VTYPE_VCARD = 0xc } vtype_type; +// convert charset of value from which specified in properties +static void +convert_charset (char* line, unsigned char** value, const char* charset) +{ + while (line = strchr (line, ';')) { + const char* key = "CHARSET="; + char org_charset[64]; + int len; + iconv_t ic; + + line++; // skip the ';' character + + if ((strlen (line) <= strlen (key)) + || g_strncasecmp (line, key, sizeof (key))) + // key not found + continue; + + org_charset[0] = 0; + len = strcspn (line + strlen (key), ";: \r\n"); + if (len >= sizeof (org_charset)) + len = sizeof (org_charset) - 1; + strncat (org_charset, line + strlen (key), len); + + ic = iconv_open (charset, org_charset); + if (ic >= 0) { + char *utfvalue = g_malloc0(65536); + size_t inbytes = strlen(*value); + size_t outbytes = 65536; + char *inbuf = *value, *outbuf = utfvalue; + + iconv(ic, &inbuf, &inbytes, &outbuf, &outbytes); + g_free(*value); + *value = utfvalue; + iconv_close(ic); + } + + break; + } // while every ';' character +} + // Parse and correct a number of errors in the VCARD/VTODO data // The "opts" parameter decides which errors/features that should be corrected char* sync_vtype_convert(char *card, sync_voption opts, char* charset) { @@ -74,6 +114,7 @@ gboolean output = TRUE; // If feedthrough output is enabled vtype_type datatype = VTYPE_UNKNOWN; outcard = g_string_new(""); while (incard) { char* endln; @@ -136,6 +177,7 @@ value = tmp; } qp = FALSE; // Do a proper QP detection + convert_charset (line, &value, "UTF-8"); if (endent) endent[0] = 0; strncpy(name, line, 255); @@ -312,7 +354,10 @@ !g_strcasecmp(propdata, "END")) triggerrelatedend = TRUE; if (!g_strcasecmp(propname, "CHARSET")) + { strncpy(linecharset, propdata, 255); + outputprop = FALSE; // value has been converted to UTF-8 + } if (adr && (!g_strcasecmp(propname, "HOME") || !g_strcasecmp(propname, "WORK"))) { @@ -362,7 +407,7 @@ value = sync_vtype_decode_qp(value); g_free(tmp); } - if ((opts & VOPTION_FIXCHARSET) && value && charset) { + if ((opts & VOPTION_FIXCHARSET) && value && charset && !linecharset[0]) { iconv_t ic; int t; gboolean highchar = FALSE; @@ -1132,6 +1177,7 @@ res = tmp; start = newstart; } while(start < card+strlen(card) && start[0] == ' '); + convert_charset (pos, &res, "UTF-8"); return(res); } } diff -ur multisync-0.82.orig/plugins/palm_sync/src/vcard.c multisync-0.82/plugins/palm_sync/src/vcard.c --- multisync-0.82.orig/plugins/palm_sync/src/vcard.c 2004-04-13 05:03:20.000000000 +0800 +++ multisync-0.82/plugins/palm_sync/src/vcard.c 2004-07-07 23:19:14.000000000 +0800 @@ -116,11 +116,11 @@ /* note */ if(appointment.note && strlen(appointment.note)) - prop = addPropValueO(vevent, VCDescriptionPropO, g_strescape(appointment.note, NULL)); + prop = addPropValueO(vevent, VCDescriptionPropO, appointment.note); /* description */ if(appointment.description) { - prop = addPropValueO(vevent, VCSummaryPropO, escape_chars(g_strescape(appointment.description, NULL))); + prop = addPropValueO(vevent, VCSummaryPropO, appointment.description); } /* begin and end*/ @@ -584,13 +584,13 @@ /* note */ if(todo.note && strlen(todo.note)) { - prop = addPropValueO(vtodo, VCDescriptionPropO, escape_chars(g_strescape(todo.note, NULL))); + prop = addPropValueO(vtodo, VCDescriptionPropO, todo.note); //addPropValueO(prop, "ENCODING", "QUOTED-PRINTABLE"); } /* description */ if(todo.description) { - addPropValueO(vtodo, VCSummaryPropO, escape_chars(g_strescape(todo.description, NULL))); + addPropValueO(vtodo, VCSummaryPropO, todo.description); } if (category) { ------------------------------------------------------- This SF.Net email sponsored by Black Hat Briefings & Training. Attend Black Hat Briefings & Training, Las Vegas July 24-29 - digital self defense, top technical experts, no vendor pitches, unmatched networking opportunities. Visit www.blackhat.com _______________________________________________ Multisync-devel mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/multisync-devel