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); }
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; }