bool ReadUnicodeCharacter(const char16* src, int32 src_len,
                          int32* char_index, uint32* code_point)
{
    if(CBU16_IS_SURROGATE(src[*char_index]))
    {
        if(!CBU16_IS_SURROGATE_LEAD(src[*char_index]) ||
                *char_index+1>=src_len ||
                !CBU16_IS_TRAIL(src[*char_index+1]))
        {
            // 非法的高代理对.
            return false;
        }

        // 合法的高代理对.
        *code_point = CBU16_GET_SUPPLEMENTARY(src[*char_index],
                                              src[*char_index+1]);
        (*char_index)++;
    }
    else
    {
        // 不是高代理, 16-bit字长.
        *code_point = src[*char_index];
    }

    return IsValidCodepoint(*code_point);
}
예제 #2
0
	bool ReadUTFChar(const wchar_t* str, int* begin, int length,
		unsigned* code_point) {
		if (CBU16_IS_SURROGATE(str[*begin])) {
			if (!CBU16_IS_SURROGATE_LEAD(str[*begin]) || *begin + 1 >= length ||
				!CBU16_IS_TRAIL(str[*begin + 1])) {
				// Invalid surrogate pair.
				*code_point = kUnicodeReplacementCharacter;
				return false;
			}
			else {
				// Valid surrogate pair.
				*code_point = CBU16_GET_SUPPLEMENTARY(str[*begin], str[*begin + 1]);
				(*begin)++;
			}
		}
		else {
			// Not a surrogate, just one 16-bit word.
			*code_point = str[*begin];
		}

		if (CBU_IS_UNICODE_CHAR(*code_point))
			return true;

		// Invalid code point.
		*code_point = kUnicodeReplacementCharacter;
		return false;
	}