UTF oddity

Alexandre Julliard julliard at winehq.org
Thu May 8 12:43:25 CDT 2003


Jan Sporbeck <jan at sporbeck-family.de> writes:

> WideCharToMultiByte returns incorrect string length when using CP_UTF8
> for conversion
> 
> the following code snippet correctly sets nLen1 to 2 but sets nLen2 only
> to 1
> 
> int nLen1 = WideCharToMultiByte(CP_UTF8, 0, L"Ü", 1, NULL, 0, NULL, NULL);
> // query buffer size
> int nLen2 = WideCharToMultiByte(CP_UTF8, 0, L"Ü", 1, szUtf, nLen1,
> NULL, NULL);
> // do conversion

Looks like we are returning the source length instead of the target
length. This should help:

Index: libs/unicode/utf8.c
===================================================================
RCS file: /home/winehq/opt/cvs-commit/wine/libs/unicode/utf8.c,v
retrieving revision 1.2
diff -u -r1.2 utf8.c
--- libs/unicode/utf8.c	21 Mar 2003 21:30:51 -0000	1.2
+++ libs/unicode/utf8.c	8 May 2003 17:36:02 -0000
@@ -62,24 +62,24 @@
 /* return -1 on dst buffer overflow */
 int wine_utf8_wcstombs( const WCHAR *src, int srclen, char *dst, int dstlen )
 {
-    int ret = srclen;
+    int len;
 
     if (!dstlen) return get_length_wcs_utf8( src, srclen );
 
-    for (ret = srclen; srclen; srclen--, src++)
+    for (len = dstlen; srclen; srclen--, src++)
     {
         WCHAR ch = *src;
 
         if (ch < 0x80)  /* 0x00-0x7f: 1 byte */
         {
-            if (!dstlen--) return -1;  /* overflow */
+            if (!len--) return -1;  /* overflow */
             *dst++ = ch;
             continue;
         }
 
         if (ch < 0x800)  /* 0x80-0x7ff: 2 bytes */
         {
-            if ((dstlen -= 2) < 0) return -1;  /* overflow */
+            if ((len -= 2) < 0) return -1;  /* overflow */
             dst[1] = 0x80 | (ch & 0x3f);
             ch >>= 6;
             dst[0] = 0xc0 | ch;
@@ -89,7 +89,7 @@
 
         /* 0x800-0xffff: 3 bytes */
 
-        if ((dstlen -= 3) < 0) return -1;  /* overflow */
+        if ((len -= 3) < 0) return -1;  /* overflow */
         dst[2] = 0x80 | (ch & 0x3f);
         ch >>= 6;
         dst[1] = 0x80 | (ch & 0x3f);
@@ -97,7 +97,7 @@
         dst[0] = 0xe0 | ch;
         dst += 3;
     }
-    return ret;
+    return dstlen - len;
 }
 
 /* query necessary dst length for src string */

-- 
Alexandre Julliard
julliard at winehq.com




More information about the wine-devel mailing list