Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Changes In Branch dkf-utf16-branch Excluding Merge-Ins
This is equivalent to a diff from 9a036eff3a to 87af801de3
|
2012-08-04
| ||
| 12:09 | Reduce the amount of ifdeffery somewhat by requiring at least OSX Tiger. That's now everyone we care... check-in: 1a67b9c45a user: dkf tags: trunk | |
| 07:52 | merge trunk Closed-Leaf check-in: 87af801de3 user: dkf tags: dkf-utf16-branch | |
| 07:51 | merge trunk Closed-Leaf check-in: d203e314d8 user: dkf tags: dkf-notifier-poll | |
| 07:49 | merge trunk check-in: 680fa63bf7 user: dkf tags: dkf-http-cookies | |
| 07:48 | merge trunk Closed-Leaf check-in: 0e556bddf4 user: dkf tags: dkf-documentation-figures | |
| 07:47 | merge trunk check-in: 942e699a9b user: dkf tags: dkf-bytecode-8.6-main | |
| 07:46 | merge trunk Closed-Leaf check-in: cd8e483be3 user: dkf tags: dkf-alias-encoding | |
| 07:41 | more result generation conversion check-in: 9a036eff3a user: dkf tags: trunk | |
|
2012-08-03
| ||
| 14:24 | more result generation conversion check-in: b3ccaec093 user: dkf tags: trunk | |
|
2012-04-21
| ||
| 09:09 | merge trunk check-in: bcbac1a341 user: dkf tags: dkf-utf16-branch | |
Changes to ChangeLog.
| ︙ | ︙ | |||
1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 | * library/tzdata/Asia/Yekaterinburg: * library/tzdata/Europe/Kaliningrad: * library/tzdata/Europe/Moscow: * library/tzdata/Europe/Samara: * library/tzdata/Europe/Volgograd: * library/tzdata/America/Kralendijk: (new) * library/tzdata/America/Lower_Princes: (new) 2011-07-26 Donal K. Fellows <dkf@users.sf.net> * generic/tclOO.c (initScript): Ensure that TclOO is properly found by all the various package mechanisms (by adding a dummy ifneeded script) and not just some of them. | > > > > > > | 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 | * library/tzdata/Asia/Yekaterinburg: * library/tzdata/Europe/Kaliningrad: * library/tzdata/Europe/Moscow: * library/tzdata/Europe/Samara: * library/tzdata/Europe/Volgograd: * library/tzdata/America/Kralendijk: (new) * library/tzdata/America/Lower_Princes: (new) 2011-07-27 Donal K. Fellows <dkf@users.sf.net> * generic/tclEncoding.c (UtfToUtfProc): Start to rough out what needs to change to transition Tcl to being able to work with non-BMP characters, at least at a basic level. 2011-07-26 Donal K. Fellows <dkf@users.sf.net> * generic/tclOO.c (initScript): Ensure that TclOO is properly found by all the various package mechanisms (by adding a dummy ifneeded script) and not just some of them. |
| ︙ | ︙ |
Changes to generic/tclEncoding.c.
| ︙ | ︙ | |||
186 187 188 189 190 191 192 193 194 195 196 197 198 199 | /* * The following variable is used in the sparse matrix code for a * TableEncoding to represent a page in the table that has no entries. */ static unsigned short emptyPage[256]; /* * Functions used only in this module. */ static int BinaryProc(ClientData clientData, const char *src, int srcLen, int flags, Tcl_EncodingState *statePtr, char *dst, int dstLen, | > > > > > > > > | 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 | /* * The following variable is used in the sparse matrix code for a * TableEncoding to represent a page in the table that has no entries. */ static unsigned short emptyPage[256]; /* * Constants used in the (external) UTF-8 <--> (internal) Modified UTF-8 * conversion code. */ #define FROM_STANDARD_UTF8 0 #define TO_STANDARD_UTF8 1 /* * Functions used only in this module. */ static int BinaryProc(ClientData clientData, const char *src, int srcLen, int flags, Tcl_EncodingState *statePtr, char *dst, int dstLen, |
| ︙ | ︙ | |||
2156 2157 2158 2159 2160 2161 2162 |
* stored in the output buffer as a result of
* the conversion. */
int *dstCharsPtr) /* Filled with the number of characters that
* correspond to the bytes stored in the
* output buffer. */
{
return UtfToUtfProc(clientData, src, srcLen, flags, statePtr, dst, dstLen,
| | | 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 |
* stored in the output buffer as a result of
* the conversion. */
int *dstCharsPtr) /* Filled with the number of characters that
* correspond to the bytes stored in the
* output buffer. */
{
return UtfToUtfProc(clientData, src, srcLen, flags, statePtr, dst, dstLen,
srcReadPtr, dstWrotePtr, dstCharsPtr, TO_STANDARD_UTF8);
}
/*
*-------------------------------------------------------------------------
*
* UtfExtToUtfIntProc --
*
|
| ︙ | ︙ | |||
2205 2206 2207 2208 2209 2210 2211 |
* stored in the output buffer as a result of
* the conversion. */
int *dstCharsPtr) /* Filled with the number of characters that
* correspond to the bytes stored in the
* output buffer. */
{
return UtfToUtfProc(clientData, src, srcLen, flags, statePtr, dst, dstLen,
| | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 |
* stored in the output buffer as a result of
* the conversion. */
int *dstCharsPtr) /* Filled with the number of characters that
* correspond to the bytes stored in the
* output buffer. */
{
return UtfToUtfProc(clientData, src, srcLen, flags, statePtr, dst, dstLen,
srcReadPtr, dstWrotePtr, dstCharsPtr, FROM_STANDARD_UTF8);
}
/*
*-------------------------------------------------------------------------
*
* UtfToUtfProc --
*
* Convert from UTF-8 to UTF-8. Note that the UTF-8 to UTF-8 translation
* is not a no-op, because it will turn a stream of improperly formed
* UTF-8 into a properly formed stream.
*
* Results:
* Returns TCL_OK if conversion was successful.
*
* Side effects:
* None.
*
*-------------------------------------------------------------------------
*/
static INLINE int
IntToUtf(
unsigned ch, /* The character to be stored in the
* buffer. */
char *buf) /* Buffer in which the UTF-8 representation of
* the character is stored. Buffer must be
* large enough to hold the UTF-8 character
* (at most 6 bytes). */
{
if ((ch > 0) && (ch < 0x80)) {
buf[0] = (char) ch;
return 1;
}
if (ch <= 0x7FF) {
buf[1] = (char) ((ch | 0x80) & 0xBF);
buf[0] = (char) ((ch >> 6) | 0xC0);
return 2;
}
if (ch <= 0xFFFF) {
three:
buf[2] = (char) ((ch | 0x80) & 0xBF);
buf[1] = (char) (((ch >> 6) | 0x80) & 0xBF);
buf[0] = (char) ((ch >> 12) | 0xE0);
return 3;
}
if (ch <= 0x1FFFFF) {
buf[3] = (char) ((ch | 0x80) & 0xBF);
buf[2] = (char) (((ch >> 6) | 0x80) & 0xBF);
buf[1] = (char) (((ch >> 12) | 0x80) & 0xBF);
buf[0] = (char) ((ch >> 18) | 0xF0);
return 4;
}
if (ch <= 0x3FFFFFF) {
buf[4] = (char) ((ch | 0x80) & 0xBF);
buf[3] = (char) (((ch >> 6) | 0x80) & 0xBF);
buf[2] = (char) (((ch >> 12) | 0x80) & 0xBF);
buf[1] = (char) (((ch >> 18) | 0x80) & 0xBF);
buf[0] = (char) ((ch >> 24) | 0xF8);
return 5;
}
if (ch <= 0x7FFFFFFF) {
buf[5] = (char) ((ch | 0x80) & 0xBF);
buf[4] = (char) (((ch >> 6) | 0x80) & 0xBF);
buf[3] = (char) (((ch >> 12) | 0x80) & 0xBF);
buf[2] = (char) (((ch >> 18) | 0x80) & 0xBF);
buf[1] = (char) (((ch >> 24) | 0x80) & 0xBF);
buf[0] = (char) ((ch >> 30) | 0xFC);
return 6;
}
ch = 0xFFFD;
goto three;
}
static INLINE int
UtfToInt(
const char *src, /* The UTF-8 string. */
unsigned *chPtr) /* Filled with the character represented by
* the front of the UTF-8 string. */
{
register int byte;
/*
* Unroll 1 to 6 byte UTF-8 sequences, use loop to handle longer ones.
*/
byte = *((unsigned char *) src);
if (byte < 0xC0) {
/*
* Handles properly formed UTF-8 characters between 0x01 and 0x7F.
* Also treats \0 and naked trail bytes 0x80 to 0xBF as valid
* characters representing themselves.
*/
*chPtr = (Tcl_UniChar) byte;
return 1;
} else if (byte < 0xE0) {
if ((src[1] & 0xC0) == 0x80) {
/*
* Two-byte-character lead-byte followed by a trail-byte.
*/
*chPtr = (Tcl_UniChar) (((byte & 0x1F) << 6) | (src[1] & 0x3F));
return 2;
}
/*
* A two-byte-character lead-byte not followed by trail-byte
* represents itself.
*/
*chPtr = (Tcl_UniChar) byte;
return 1;
} else if (byte < 0xF0) {
if (((src[1] & 0xC0) == 0x80) && ((src[2] & 0xC0) == 0x80)) {
/*
* Three-byte-character lead byte followed by two trail bytes.
*/
*chPtr = (Tcl_UniChar) (((byte & 0x0F) << 12)
| ((src[1] & 0x3F) << 6) | (src[2] & 0x3F));
return 3;
}
/*
* A three-byte-character lead-byte not followed by two trail-bytes
* represents itself.
*/
*chPtr = (Tcl_UniChar) byte;
return 1;
} else {
int ch, total, trail;
static const unsigned char totalBytes[256] = {
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,6,6
};
total = totalBytes[byte];
trail = total - 1;
if (trail > 0) {
ch = byte & (0x3F >> trail);
do {
src++;
if ((*src & 0xC0) != 0x80) {
*chPtr = byte;
return 1;
}
ch <<= 6;
ch |= (*src & 0x3F);
trail--;
} while (trail > 0);
*chPtr = ch;
return total;
} else {
*chPtr = (Tcl_UniChar) byte;
return 1;
}
}
}
static int
UtfToUtfProc(
ClientData clientData, /* Not used. */
const char *src, /* Source string in UTF-8. */
int srcLen, /* Source string length in bytes. */
int flags, /* Conversion control flags. */
|
| ︙ | ︙ | |||
2252 2253 2254 2255 2256 2257 2258 |
* characters. */
int *dstWrotePtr, /* Filled with the number of bytes that were
* stored in the output buffer as a result of
* the conversion. */
int *dstCharsPtr, /* Filled with the number of characters that
* correspond to the bytes stored in the
* output buffer. */
| | | 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 |
* characters. */
int *dstWrotePtr, /* Filled with the number of bytes that were
* stored in the output buffer as a result of
* the conversion. */
int *dstCharsPtr, /* Filled with the number of characters that
* correspond to the bytes stored in the
* output buffer. */
int conversionMode) /* Convert embedded nulls from internal
* representation to real null-bytes or vice
* versa. */
{
const char *srcStart, *srcEnd, *srcClose;
const char *dstStart, *dstEnd;
int result, numChars;
Tcl_UniChar ch;
|
| ︙ | ︙ | |||
2287 2288 2289 2290 2291 2292 2293 |
result = TCL_CONVERT_MULTIBYTE;
break;
}
if (dst > dstEnd) {
result = TCL_CONVERT_NOSPACE;
break;
}
| | > | | | > > > > > > > > > | > > > > > > > > > > > > | > > > > > > > > > > > > > > > | 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 |
result = TCL_CONVERT_MULTIBYTE;
break;
}
if (dst > dstEnd) {
result = TCL_CONVERT_NOSPACE;
break;
}
if (UCHAR(*src) < 0x80 &&
!(UCHAR(*src) == 0 && conversionMode == FROM_STANDARD_UTF8)) {
/*
* Copy 7bit chatacters, but skip null-bytes when we are in input
* mode, so that they get converted to 0xc080.
*/
*dst++ = *src++;
} else if (conversionMode == TO_STANDARD_UTF8 && UCHAR(*src) == 0xc0
&& UCHAR(*(src+1)) == 0x80) {
/*
* Convert 0xc080 to real nulls when we are in output mode.
*/
*dst++ = 0;
src += 2;
} else if (!Tcl_UtfCharComplete(src, srcEnd - src)) {
/*
* Always check before using Tcl_UtfToUniChar. Not doing can so
* cause it run beyond the endof the buffer! If we happen such an
* incomplete char, its bytes are made to represent themselves.
*/
ch = (unsigned char) *src;
src += 1;
dst += Tcl_UniCharToUtf(ch, dst);
} else {
/*
* This is where we ought to do surrogate pair handling, with the
* correct way of doing it depending on the conversionMode
* parameter. But we don't. Yet. KNOWN BUG/MISFEATURE!
*/
if (conversionMode == TO_STANDARD_UTF8) {
const char *origin = src;
src += Tcl_UtfToUniChar(src, &ch);
if (ch >= 0xD800 && ch < 0xDBFF) {
unsigned fullChar = ((unsigned)(ch - 0xD800)) << 10;
src += Tcl_UtfToUniChar(src, &ch);
if (ch >= 0xDC00 && ch < 0xDFFF) {
fullChar += 0x2400 + (unsigned) ch;
dst += IntToUtf(fullChar, dst);
continue;
} else {
src = origin + Tcl_UtfToUniChar(origin, &ch);
}
}
dst += Tcl_UniCharToUtf(ch, dst);
} else {
unsigned fullChar;
src += UtfToInt(src, &fullChar);
if (fullChar > 0xFFFF) {
fullChar -= 0x10000;
ch = (Tcl_UniChar) ((fullChar >> 10) + 0xD800);
dst += Tcl_UniCharToUtf(ch, dst);
ch = (Tcl_UniChar) ((fullChar & 0x3FF) + 0xDC00);
dst += Tcl_UniCharToUtf(ch, dst);
} else {
ch = (Tcl_UniChar) fullChar;
dst += Tcl_UniCharToUtf(ch, dst);
}
}
}
}
*srcReadPtr = src - srcStart;
*dstWrotePtr = dst - dstStart;
*dstCharsPtr = numChars;
return result;
|
| ︙ | ︙ |
Changes to generic/tclUtf.c.
| ︙ | ︙ | |||
129 130 131 132 133 134 135 |
}
if (ch <= 0x7FFFFFFF) {
return 6;
}
#endif
return 3;
}
| | | 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
}
if (ch <= 0x7FFFFFFF) {
return 6;
}
#endif
return 3;
}
/*
*---------------------------------------------------------------------------
*
* Tcl_UniCharToUtf --
*
* Store the given Tcl_UniChar as a sequence of UTF-8 bytes in the
* provided buffer. Equivalent to Plan 9 runetochar().
|
| ︙ | ︙ |
Changes to generic/tclZlib.c.
| ︙ | ︙ | |||
1609 1610 1611 1612 1613 1614 1615 |
FMT_COMPRESS, FMT_DECOMPRESS, FMT_DEFLATE, FMT_GUNZIP, FMT_GZIP,
FMT_INFLATE
};
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "command arg ?...?");
return TCL_ERROR;
| < | | 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 |
FMT_COMPRESS, FMT_DECOMPRESS, FMT_DEFLATE, FMT_GUNZIP, FMT_GZIP,
FMT_INFLATE
};
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "command arg ?...?");
return TCL_ERROR;
} else if (Tcl_GetIndexFromObj(interp, objv[1], commands, "command", 0,
&command) != TCL_OK) {
return TCL_ERROR;
}
switch ((enum zlibCommands) command) {
case CMD_ADLER: /* adler32 str ?startvalue?
* -> checksum */
|
| ︙ | ︙ | |||
1968 1969 1970 1971 1972 1973 1974 |
case poLimit:
if (++i > objc-1) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"value missing for -limit option", -1));
Tcl_SetErrorCode(interp, "TCL", "ZIP", "NOVAL", NULL);
return TCL_ERROR;
}
| | < > > > > | 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 |
case poLimit:
if (++i > objc-1) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"value missing for -limit option", -1));
Tcl_SetErrorCode(interp, "TCL", "ZIP", "NOVAL", NULL);
return TCL_ERROR;
}
if (Tcl_GetIntFromObj(interp, objv[i], (int *) &limit) != TCL_OK) {
Tcl_AddErrorInfo(interp, "\n (in -limit option)");
return TCL_ERROR;
}
if (limit < 1) {
limit = 1;
}
break;
}
}
/*
* Actually do the push of the instance of the transform.
*/
if (ZlibStackChannelTransform(interp, mode, format, level, chan,
headerObj) == NULL) {
return TCL_ERROR;
}
Tcl_SetObjResult(interp, objv[3]);
return TCL_OK;
}
|
| ︙ | ︙ | |||
2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 |
static const char *const add_options[] = {
"-buffer", "-finalize", "-flush", "-fullflush", NULL
};
enum addOptions {
ao_buffer, ao_finalize, ao_flush, ao_fullflush
};
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "option data ?...?");
return TCL_ERROR;
| > > > > < < | > > > > | 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 |
static const char *const add_options[] = {
"-buffer", "-finalize", "-flush", "-fullflush", NULL
};
enum addOptions {
ao_buffer, ao_finalize, ao_flush, ao_fullflush
};
/*
* Basic syntax checks.
*/
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "option data ?...?");
return TCL_ERROR;
} else if (Tcl_GetIndexFromObj(interp, objv[1], cmds, "option", 0,
&command) != TCL_OK) {
return TCL_ERROR;
}
/*
* Execute a relevant subcommand.
*/
switch ((enum zlibStreamCommands) command) {
case zs_add: /* $strm add ?$flushopt? $data */
for (i=2; i<objc-1; i++) {
if (Tcl_GetIndexFromObj(interp, objv[i], add_options, "option", 0,
&index) != TCL_OK) {
return TCL_ERROR;
}
|
| ︙ | ︙ | |||
2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 |
}
if (buffersize < 1 || buffersize > 65536) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"buffer size must be 32 to 65536", -1));
Tcl_SetErrorCode(interp, "TCL", "VALUE", "BUFFERSIZE",
NULL);
return TCL_ERROR;
}
}
if (flush == -2) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"\"-flush\", \"-fullflush\" and \"-finalize\" options"
" are mutually exclusive", -1));
| > > > > > | 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 |
}
if (buffersize < 1 || buffersize > 65536) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"buffer size must be 32 to 65536", -1));
Tcl_SetErrorCode(interp, "TCL", "VALUE", "BUFFERSIZE",
NULL);
return TCL_ERROR;
}
if (buffersize < 1 || buffersize > 65536) {
Tcl_AppendResult(interp, "buffer size must be between "
"1 byte and 64 kibibytes", NULL);
return TCL_ERROR;
}
}
if (flush == -2) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"\"-flush\", \"-fullflush\" and \"-finalize\" options"
" are mutually exclusive", -1));
|
| ︙ | ︙ |
Changes to tests/encoding.test.
| ︙ | ︙ | |||
323 324 325 326 327 328 329 330 331 332 333 334 335 336 |
} {2 1 00}
test encoding-15.3 {UtfToUtfProc null character input} {
set x [encoding convertfrom identity \x00]
set y [encoding convertfrom utf-8 $x]
binary scan [encoding convertto identity $y] H* z
list [string bytelength $x] [string bytelength $y] $z
} {1 2 c080}
test encoding-16.1 {UnicodeToUtfProc} {
set val [encoding convertfrom unicode NN]
list $val [format %x [scan $val %c]]
} "\u4e4e 4e4e"
test encoding-17.1 {UtfToUnicodeProc} {
| > > > > > > > > > | 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 |
} {2 1 00}
test encoding-15.3 {UtfToUtfProc null character input} {
set x [encoding convertfrom identity \x00]
set y [encoding convertfrom utf-8 $x]
binary scan [encoding convertto identity $y] H* z
list [string bytelength $x] [string bytelength $y] $z
} {1 2 c080}
test encoding-15.4 {UtfToUtfProc: UTF-8 to UTF-16 and back} {
set x \xF0\xA4\xAD\xA2; # U+024B62
set y [encoding convertfrom utf-8 $x]
set z [encoding convertto utf-8 $y]
list [string length $x] [string length $y] [string length $z] \
[format 0x%04x.0x%04x {*}[scan $y %c%c]] \
[format %02x.%02x.%02x.%02x {*}[scan $z %c%c%c%c]]
} {4 2 4 0xd852.0xdf62 f0.a4.ad.a2}
test encoding-16.1 {UnicodeToUtfProc} {
set val [encoding convertfrom unicode NN]
list $val [format %x [scan $val %c]]
} "\u4e4e 4e4e"
test encoding-17.1 {UtfToUnicodeProc} {
|
| ︙ | ︙ |