diff -ur qt-x11-free-3.0.0-beta4.orig/src/kernel/qclipboard_x11.cpp qt-x11-free-3.0.0-beta4/src/kernel/qclipboard_x11.cpp
--- qt-x11-free-3.0.0-beta4.orig/src/kernel/qclipboard_x11.cpp	Fri Aug 24 02:46:56 2001
+++ qt-x11-free-3.0.0-beta4/src/kernel/qclipboard_x11.cpp	Mon Sep 10 15:22:55 2001
@@ -415,7 +415,8 @@
 	    if ( r != Success )
 		break;
 
-	    offset += length / (32 / *format);
+	    // offset += length / (32 / *format);
+	    offset += length;
 	    length *= format_inc * (*format) / 8;
 
 	    // Here we check if we get a buffer overflow and tries to
@@ -434,6 +435,31 @@
 	    XFree( (char*)data );
 	}
 
+ 	// see if we read multibyte text data
+ 	static Atom xa_compound = *qt_xdnd_str_to_atom( "COMPOUND_TEXT" );
+ 	if (*format == 8 && *type == xa_compound) {
+	    // qDebug("qt_xclb_read_property(): COMPOUND_TEXT");
+	    // qDebug("\t: offset = %d", offset);
+ 	    XTextProperty textprop;
+ 	    textprop.encoding = *type;
+ 	    textprop.format = *format;
+ 	    textprop.nitems = offset;
+ 	    textprop.value = (unsigned char *) buffer->data();
+ 
+ 	    char **list_ret = 0;
+ 	    int count;
+	    int f = XmbTextPropertyToTextList(dpy, &textprop, &list_ret, &count);
+ 	    // if (f == Success) { qDebug("\tSuccess"); } else { qDebug("\tnot Success"); }
+ 	    if (f == Success && count && list_ret) {
+		// qDebug("\t: count = %d", count);
+ 		offset = strlen(list_ret[0]);
+		// qDebug("\t: offset = %d", offset);
+ 		buffer->resize(offset + (nullterm ? 1 : 0));
+ 		memcpy(buffer->data(), list_ret[0], offset);
+ 	    }
+ 	    if (list_ret) XFreeStringList(list_ret);
+ 	}
+  	
 	// zero-terminate (for text)
        	if (nullterm)
 	    buffer->at(buffer_offset) = '\0';
@@ -650,6 +676,10 @@
 	    QByteArray data;
 	    static Atom xa_targets = *qt_xdnd_str_to_atom( "TARGETS" );
 	    static Atom xa_multiple = *qt_xdnd_str_to_atom( "MULTIPLE" );
+	    // for Multibyte-string
+	    static Atom xa_utf8 = *qt_xdnd_str_to_atom( "UTF8_STRING" );
+	    static Atom xa_compound = *qt_xdnd_str_to_atom( "COMPOUND_TEXT" );
+	    static Atom xa_text = *qt_xdnd_str_to_atom( "TEXT" );
 	    struct AtomPair { Atom target; Atom property; } *multi = 0;
 	    int nmulti = 0;
 	    int imulti = -1;
@@ -685,7 +715,7 @@
 		    while (d->source()->format(atoms)) atoms++;
 		    if (d->source()->provides("image/ppm")) atoms++;
 		    if (d->source()->provides("image/pbm")) atoms++;
-		    if (d->source()->provides("text/plain")) atoms++;
+		    if (d->source()->provides("text/plain")) atoms+=3;
 
 #if defined(QCLIPBOARD_DEBUG_VERBOSE)
 		    qDebug("qclipboard_x11.cpp:%d: %d provided types", __LINE__, atoms);
@@ -713,8 +743,11 @@
 			atarget[n++] = XA_PIXMAP;
 		    if ( d->source()->provides("image/pbm") )
 			atarget[n++] = XA_BITMAP;
-		    if ( d->source()->provides("text/plain") )
+		    if ( d->source()->provides("text/plain") ) {
+			atarget[n++] = xa_utf8;
+			atarget[n++] = xa_compound;
 			atarget[n++] = XA_STRING;
+		    }
 
 #if defined(QCLIPBOARD_DEBUG_VERBOSE)
 		    for (int index = 0; index < n; index++) {
@@ -738,6 +771,33 @@
 		    bool already_done = FALSE;
 		    if ( target == XA_STRING) {
 			fmt = "text/plain";
+		    } else if ( target == xa_compound || target == xa_text) {
+			// for COMPOUND_TEXT
+			fmt = "COMPOUND_TEXT";
+			data = d->source()->encodedData(fmt);
+			char *list[] = { data.data() };
+			XICCEncodingStyle style;
+			if (target == xa_compound) {
+			    style = XCompoundTextStyle;
+			} else {
+			    style = XStdICCTextStyle;
+			}
+
+			XTextProperty textprop;
+			if (XmbTextListToTextProperty(dpy, list, 1, style,
+						    &textprop) == Success) {
+			    data.duplicate((const char *) textprop.value,
+					    textprop.nitems);
+			    XFree(textprop.value);
+			    XChangeProperty(dpy, req->requestor, property,
+                                            xa_compound,
+					    8, PropModeReplace,
+					    (unsigned char *) data.data(),
+					    data.size());
+			    evt.xselection.property = property;
+			    already_done = TRUE;
+			}
+
 		    } else if ( target == XA_PIXMAP ) {
 			fmt = "image/ppm";
 			data = d->source()->encodedData(fmt);
@@ -849,6 +909,61 @@
 	QClipboardWatcher *that = (QClipboardWatcher *) this;
 	QByteArray ba = getDataInFormat(xa_targets);
 	Atom *target = (Atom *) ba.data();
+
+	// sort format
+	//     UTF8_STRING < COMPOUND_TEXT < TEXT
+
+	// Why sort.
+	//     UTF8_STRING: support UTF8-string
+	//     COMPOUND_TEXT: support only Locale-string
+	//     TEXT: support only latin1-string
+	// So, We should check UTF8_STRING first.
+	int natoms = ba.size()/sizeof(Atom);
+	static Atom xa_utf8 = *qt_xdnd_str_to_atom( "UTF8_STRING" );
+	static Atom xa_compound = *qt_xdnd_str_to_atom( "COMPOUND_TEXT" );
+	static Atom xa_text = *qt_xdnd_str_to_atom( "TEXT" );
+
+	int n_utf8 = -1;
+	int n_compound = -1;
+	int dn = 0;
+	for (int i = 0; i < natoms; i++) {
+#if 0
+	    qDebug("target[%d] = %s", i, qt_xdnd_atom_to_str(target[i]));
+#endif
+	    if (target[i] == xa_utf8) {
+		n_utf8 = i;
+		dn++;
+	    }
+	    if (target[i] == xa_compound) {
+		n_compound = i;
+		dn++;
+	    }
+	}
+	if (dn > 0) {
+	    int maxn = (n_utf8 > n_compound) ? n_utf8 : n_compound;
+	    int minn = (n_utf8 < n_compound) ? n_utf8 : n_compound;
+	    for (int i = 0; i < maxn; i++) {
+		if (target[i] == XA_STRING || target[i] == xa_text ||
+		    target[i] == xa_compound) {
+		    int k = 1;
+		    for (int j = maxn; j > i + (dn - 1); j--) {
+			if (j-k == minn) {
+			    k++;
+			}
+			target[j] = target[j-k];
+		    }
+		    if (n_utf8 >= 0) target[i++] = xa_utf8;
+		    if (n_compound >= 0) target[i++] = xa_compound;
+		    break;
+		}
+	    }
+	}
+#if 0
+	for (int i = 0; i < natoms; i++) {
+	    qDebug("\tTarget[%d] = %s", i, qt_xdnd_atom_to_str(target[i]));
+	}
+#endif
+
 	int i, size = ba.size() / sizeof(Atom);
 	for (i = 0; i < size; i++)
 	    if ( *target == XA_PIXMAP )
diff -ur qt-x11-free-3.0.0-beta4.orig/src/kernel/qdragobject.cpp qt-x11-free-3.0.0-beta4/src/kernel/qdragobject.cpp
--- qt-x11-free-3.0.0-beta4.orig/src/kernel/qdragobject.cpp	Fri Aug 24 02:46:58 2001
+++ qt-x11-free-3.0.0-beta4/src/kernel/qdragobject.cpp	Mon Sep 10 15:20:55 2001
@@ -692,6 +692,12 @@
 	    // Don't include NUL in size (QCString::resize() adds NUL)
 	    ((QByteArray&)r).resize(r.length());
 	}
+    } else if ( 0==qstricmp(mime,"UTF8_STRING") ) {
+	// qDebug("QTextDrag::encodedData(): UTF8_STRING");
+	r = d->txt.utf8();
+    } else if ( 0==qstricmp(mime,"COMPOUND_TEXT") ) {
+	// qDebug("QTextDrag::encodedData(): COMPOUND_TEXT");
+	r = d->txt.local8Bit();
     }
     return r;
 }
@@ -774,6 +780,24 @@
 		    }
 		}
 	    }
+	} else if ( 0==qstricmp(mime,"UTF8_STRING")) {
+	    QByteArray payload;
+	    payload = e->encodedData(mime);
+	    // qDebug("QTextDrag::decode(): UTF8_STRING %d", payload.size());
+	    if ( payload.size() ) {
+		str = QString::fromUtf8(payload, payload.size());
+		subtype = "plain;charset=UTF-8";
+		return TRUE;
+	    }
+	} else if ( 0==qstricmp(mime,"COMPOUND_TEXT")) {
+	    QByteArray payload;
+	    payload = e->encodedData(mime);
+	    // qDebug("QTextDrag::decode(): COMPOUND_TEXT %d", payload.size());
+	    if ( payload.size() ) {
+		str = QString::fromLocal8Bit(payload, payload.size());
+		subtype = "plain";
+		return TRUE;
+	    }
 	}
     }
     return FALSE;
