⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utf8.cpp

📁 Symbian操作系统手机上可执行程序的安装打包程序的源码
💻 CPP
字号:
/* * Copyright 2001 Unicode, Inc. *  * Disclaimer *  * This source code is provided as is by Unicode, Inc. No claims are * made as to fitness for any particular purpose. No warranties of any * kind are expressed or implied. The recipient agrees to determine * applicability of information provided. If this file has been * purchased on magnetic or optical media from Unicode, Inc., the * sole remedy for any claim will be exchange of defective media * within 90 days of receipt. *  * Limitations on Rights to Redistribute This Code *  * Unicode, Inc. hereby grants the right to freely use the information * supplied in this file in the creation of products supporting the * Unicode Standard, and to make copies of this file in any form * for internal or external distribution as long as this notice * remains attached. *//* ---------------------------------------------------------------------    Conversions between UTF32, UTF-16, and UTF-8. Source code file.    Author: Mark E. Davis, 1994.    Rev History: Rick McGowan, fixes & updates May 2001.    Sept 2001: fixed const & error conditions per	mods suggested by S. Parent & A. Lillich.    June 2002: Tim Dodd added detection and handling of incomplete	source sequences, enhanced error detection, added casts	to eliminate compiler warnings.    See the header file "ConvertUTF.h" for complete documentation.------------------------------------------------------------------------ *//** Symbian Note: 	The following and complete source can be retrieved from :    http://www.unicode.org/Public/ALPHA/CVTUTF-1-1/	files UTF8.h and UTF8.c were renamed from the original ConvertUTF8.h	and ConvertUTF8.c respectively and most functions (which are not used, were	gently removed from these files without hurting them :-)*/#include  "utf8.h" static const int halfShift  = 10; /* used for shifting by 10 bits */static const UTF32 halfBase = 0x0010000UL;static const UTF32 halfMask = 0x3FFUL;#define UNI_SUR_HIGH_START  (UTF32)0xD800#define UNI_SUR_HIGH_END    (UTF32)0xDBFF#define UNI_SUR_LOW_START   (UTF32)0xDC00#define UNI_SUR_LOW_END     (UTF32)0xDFFF#define false	   0#define true	    1/* --------------------------------------------------------------------- *//* --------------------------------------------------------------------- *//* * Index into the table below with the first byte of a UTF-8 sequence to * get the number of trailing bytes that are supposed to follow it. */static const char trailingBytesForUTF8[256] = {    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    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, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5};/* * Magic values subtracted from a buffer value during UTF8 conversion. * This table contains as many values as there might be trailing bytes * in a UTF-8 sequence. */static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, 		     0x03C82080UL, 0xFA082080UL, 0x82082080UL };/* * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed * into the first byte, depending on how many bytes follow.  There are * as many entries in this table as there are UTF-8 sequence types. * (I.e., one byte sequence, two byte... six byte sequence.) */static const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };/* --------------------------------------------------------------------- *//* The interface converts a whole buffer to avoid function-call overhead. * Constants have been gathered. Loops & conditionals have been removed as * much as possible for efficiency, in favor of drop-through switches. * (See "Note A" at the bottom of the file for equivalent code.) * If your compiler supports it, the "isLegalUTF8" call can be turned * into an inline function. *//* --------------------------------------------------------------------- *//* --------------------------------------------------------------------- *//* * Utility routine to tell whether a sequence of bytes is legal UTF-8. * This must be called with the length pre-determined by the first byte. * If not calling this from ConvertUTF8to*, then the length can be set by: *  length = trailingBytesForUTF8[*source]+1; * and the sequence is illegal right away if there aren't that many bytes * available. * If presented with a length > 4, this returns false.  The Unicode * definition of UTF-8 goes up to 4-byte sequences. */static Boolean isLegalUTF8(const UTF8 *source, int length) {    UTF8 a;    const UTF8 *srcptr = source+length;    switch (length) {    default: return false;	/* Everything else falls through when "true"... */    case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;    case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;    case 2: if ((a = (*--srcptr)) > 0xBF) return false;	switch (*source) {	    /* no fall-through in this inner switch */	    case 0xE0: if (a < 0xA0) return false; break;	    case 0xF0: if (a < 0x90) return false; break;	    case 0xF4: if (a > 0x8F) return false; break;	    default:  if (a < 0x80) return false;	}	case 1: if (*source >= 0x80 && *source < 0xC2) return false;	if (*source > 0xF4) return false;    }    return true;}/* --------------------------------------------------------------------- */ConversionResult ConvertUTF8toUTF16 (	const UTF8** sourceStart, const UTF8* sourceEnd, 	UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {    ConversionResult result = conversionOK;    const UTF8* source = *sourceStart;    UTF16* target = *targetStart;    while (source < sourceEnd) {	UTF32 ch = 0;	unsigned short extraBytesToRead = trailingBytesForUTF8[*source];	if (source + extraBytesToRead >= sourceEnd) {	    result = sourceExhausted; break;	}	/* Do this check whether lenient or strict */	if (! isLegalUTF8(source, extraBytesToRead+1)) {	    result = sourceIllegal;	    break;	}	/*	 * The cases all fall through. See "Note A" below.	 */	switch (extraBytesToRead) {	    case 3: ch += *source++; ch <<= 6;	    case 2: ch += *source++; ch <<= 6;	    case 1: ch += *source++; ch <<= 6;	    case 0: ch += *source++;	}	ch -= offsetsFromUTF8[extraBytesToRead];	if (target >= targetEnd) {	    source -= (extraBytesToRead+1); /* Back up source pointer! */	    result = targetExhausted; break;	}	if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */	    /* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */	    if ((ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) || ((ch & 0xFFFE) == 0xFFFE)) {		if (flags == strictConversion) {		    source -= (extraBytesToRead+1); /* return to the illegal value itself */		    result = sourceIllegal;		    break;		} else {		    *target++ = UNI_REPLACEMENT_CHAR;		}	    } else {		*target++ = (UTF16)ch; /* normal case */	    }	} else if (ch > UNI_MAX_UTF16) {	    if (flags == strictConversion) {		result = sourceIllegal;		source -= (extraBytesToRead+1); /* return to the start */		break; /* Bail out; shouldn't continue */	    } else {		*target++ = UNI_REPLACEMENT_CHAR;	    }	} else {	    /* target is a character in range 0xFFFF - 0x10FFFF. */	    if (target + 1 >= targetEnd) {		source -= (extraBytesToRead+1); /* Back up source pointer! */		result = targetExhausted; break;	    }	    ch -= halfBase;	    *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);	    *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);	}    }    *sourceStart = source;    *targetStart = target;    return result;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -