|
@ -378,6 +378,10 @@ void UTF<char>::generate(const char32_t c, OutIter& out) |
|
|
*out++ = char( 0x80 + (c & 63)); |
|
|
*out++ = char( 0x80 + (c & 63)); |
|
|
}else if(c<=0xFFFF) |
|
|
}else if(c<=0xFFFF) |
|
|
{ |
|
|
{ |
|
|
|
|
|
if(c>=0xD800 && c<=0xDFFF) |
|
|
|
|
|
{ |
|
|
|
|
|
throw unexpected_surrogate(c); |
|
|
|
|
|
} |
|
|
*out++ = char( 0xE0 + (c>>12) ); |
|
|
*out++ = char( 0xE0 + (c>>12) ); |
|
|
*out++ = char( 0x80 + ((c>>6) & 63)); |
|
|
*out++ = char( 0x80 + ((c>>6) & 63)); |
|
|
*out++ = char( 0x80 + (c & 63)); |
|
|
*out++ = char( 0x80 + (c & 63)); |
|
@ -637,6 +641,10 @@ size_t UTF<char>::utf_length(u32string_view s) |
|
|
len += 2; |
|
|
len += 2; |
|
|
}else if(c<=0xffff) |
|
|
}else if(c<=0xffff) |
|
|
{ |
|
|
{ |
|
|
|
|
|
if(c>=0xD800 && c<=0xDFFF) |
|
|
|
|
|
{ |
|
|
|
|
|
throw unexpected_surrogate(c); |
|
|
|
|
|
} |
|
|
len += 3; |
|
|
len += 3; |
|
|
}else if(c<=0x10ffff) |
|
|
}else if(c<=0x10ffff) |
|
|
{ |
|
|
{ |
|
@ -650,6 +658,31 @@ size_t UTF<char>::utf_length(u32string_view s) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template<> |
|
|
|
|
|
size_t UTF<char16_t>::utf_length(u32string_view s) |
|
|
|
|
|
{ |
|
|
|
|
|
size_t len = 0; |
|
|
|
|
|
for(const char32_t c : s) |
|
|
|
|
|
{ |
|
|
|
|
|
if(c <= 0xffff) |
|
|
|
|
|
{ |
|
|
|
|
|
if(c>=0xD800 && c<=0xDFFF) |
|
|
|
|
|
{ |
|
|
|
|
|
throw unexpected_surrogate(c); |
|
|
|
|
|
} |
|
|
|
|
|
len += 1; |
|
|
|
|
|
}else if(c<=0x10ffff) |
|
|
|
|
|
{ |
|
|
|
|
|
len += 2; |
|
|
|
|
|
}else{ |
|
|
|
|
|
throw too_big(0, c); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return len; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// convenience function to avoid ::strdup(pEp::toNFC<char>(text).c_str());
|
|
|
// convenience function to avoid ::strdup(pEp::toNFC<char>(text).c_str());
|
|
|
// and unecessary temporary std::string etc.
|
|
|
// and unecessary temporary std::string etc.
|
|
|
char* strdup_NFC(string_view s) |
|
|
char* strdup_NFC(string_view s) |
|
|