Conversion of 4-byte UTF-8 sequences.

Christina Brien <[email protected]> Thu, 24 Apr 2014 18:51:21 +0100
Newsgroups gmane.comp.internationalization.fribidi
Message-ID <[email protected]>
Hi

fribidi_utf8_to_unicode() doesn’t currently support 4-byte UTF-8 sequences (although the converse, fribidi_unicode_to_utf8(), does).

Here is a patch to fix this.

Christina Brien
Cisco Systems

_______________________________________________
fribidi mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/fribidi
fribidi-utf8.diff (application/octet-stream, 1013 B)
# HG changeset patch
# User Christina Brien <[email protected]>
# Date 1398360400 -3600
#      Thu Apr 24 18:26:40 2014 +0100
# Node ID bed052a538c971d0f4f2ca03d65e3bc0d1392fe8
# Parent  58c380f8b560ad84a821638175996b3f51095dae
Support 4-byte UTF-8 sequences.

diff -r 58c380f8b560 -r bed052a538c9 charset/fribidi-char-sets-utf8.c
--- a/charset/fribidi-char-sets-utf8.c	Mon Apr 14 12:15:01 2014 +0100
+++ b/charset/fribidi-char-sets-utf8.c	Thu Apr 24 18:26:40 2014 +0100
@@ -65,13 +65,22 @@
 	  *us++ = ((*s & 0x1f) << 6) + (*(s + 1) & 0x3f);
 	  s += 2;
 	}
-      else			/* 3 byte */
+      else if (ch <= 0xef)	/* 3 byte */
 	{
 	  *us++ =
 	    ((int) (*s & 0x0f) << 12) +
 	    ((*(s + 1) & 0x3f) << 6) + (*(s + 2) & 0x3f);
 	  s += 3;
 	}
+      else                     /* 4 byte */
+      {
+	  *us++ =
+	    ((int) (*s & 0x07) << 18) +
+	    ((*(s + 1) & 0x3f) << 12) +
+	    ((*(s + 2) & 0x3f) << 6) +
+	    ((*(s + 3) & 0x3f) << 0);
+	  s += 4;
+      }
       length++;
     }
   return (length);