B::perlstring and unicode
[p5sagit/p5-mst-13.2.git] / utf8.h
diff --git a/utf8.h b/utf8.h
index 49531a9..a5312ca 100644 (file)
--- a/utf8.h
+++ b/utf8.h
@@ -63,20 +63,43 @@ END_EXTERN_C
 
 /*
 
- The following table is from Unicode 3.1.
+ The following table is from Unicode 3.2.
 
  Code Points           1st Byte  2nd Byte  3rd Byte  4th Byte
 
-   U+0000..U+007F      00..7F   
-   U+0080..U+07FF      C2..DF    80..BF   
-   U+0800..U+0FFF      E0        A0..BF    80..BF  
-   U+1000..U+FFFF      E1..EF    80..BF    80..BF  
+   U+0000..U+007F      00..7F
+   U+0080..U+07FF      C2..DF    80..BF
+   U+0800..U+0FFF      E0        A0..BF    80..BF
+   U+1000..U+CFFF       E1..EC    80..BF    80..BF
+   U+D000..U+D7FF       ED        80..9F    80..BF
+   U+D800..U+DFFF       ******* ill-formed *******
+   U+E000..U+FFFF       EE..EF    80..BF    80..BF
   U+10000..U+3FFFF     F0        90..BF    80..BF    80..BF
   U+40000..U+FFFFF     F1..F3    80..BF    80..BF    80..BF
  U+100000..U+10FFFF    F4        80..8F    80..BF    80..BF
 
+Note the A0..BF in U+0800..U+0FFF, the 80..9F in U+D000...U+D7FF,
+the 90..BF in U+10000..U+3FFFF, and the 80...8F in U+100000..U+10FFFF.
+
  */
 
+/*
+ Another way to look at it, as bits:
+
+ Code Points                    1st Byte   2nd Byte  3rd Byte  4th Byte
+
+                    0aaaaaaa     0aaaaaaa
+            00000bbbbbaaaaaa     110bbbbb  10aaaaaa
+            ccccbbbbbbaaaaaa     1110cccc  10bbbbbb  10aaaaaa
+  00000dddccccccbbbbbbaaaaaa     11110ddd  10cccccc  10bbbbbb  10aaaaaa
+
+As you can see, the continuation bytes all begin with C<10>, and the
+leading bits of the start byte tell how many bytes the are in the
+encoded character.
+
+*/
+
+
 #define UNI_IS_INVARIANT(c)            (((UV)c) <  0x80)
 #define UTF8_IS_INVARIANT(c)           UNI_IS_INVARIANT(NATIVE_TO_UTF(c))
 #define NATIVE_IS_INVARIANT(c)         UNI_IS_INVARIANT(NATIVE_TO_ASCII(c))
@@ -138,9 +161,11 @@ END_EXTERN_C
 /* how wide can a single UTF8 encoded character become */
 #define UTF8_MAXLEN 13
 /* how wide a character can become when upper/lowercased */
-#define UTF8_MAXLEN_UCLC (UTF8_MAXLEN*2)
+#define UTF8_MAXLEN_UCLC_MULT 3
+#define UTF8_MAXLEN_UCLC (UTF8_MAXLEN*UTF8_MAXLEN_UCLC_MULT)
 /* how wide a character can become when casefolded */
-#define UTF8_MAXLEN_FOLD (UTF8_MAXLEN*3)
+#define UTF8_MAXLEN_FOLD_MULT 3
+#define UTF8_MAXLEN_FOLD (UTF8_MAXLEN*UTF8_MAXLEN_FOLD_MULT)
 
 #define IN_BYTES (PL_curcop->op_private & HINT_BYTES)
 #define DO_UTF8(sv) (SvUTF8(sv) && !IN_BYTES)