载入中...
搜索中...
未找到
Utf8Validation.cpp
浏览该文件的文档.
2
3namespace eve {
4
5bool isValidUtf8(std::string_view text, Utf8NullPolicy nullPolicy) noexcept {
6 for (std::size_t index = 0; index < text.size();) {
7 const auto lead = static_cast<std::uint8_t>(text[index]);
8 if (lead < 0x80) {
9 if (lead == 0 && nullPolicy == Utf8NullPolicy::Reject) return false;
10 ++index;
11 continue;
12 }
13 std::size_t continuation = 0;
14 std::uint32_t codepoint = 0;
15 if ((lead & 0xe0u) == 0xc0u) {
16 continuation = 1;
17 codepoint = lead & 0x1fu;
18 } else if ((lead & 0xf0u) == 0xe0u) {
19 continuation = 2;
20 codepoint = lead & 0x0fu;
21 } else if ((lead & 0xf8u) == 0xf0u) {
22 continuation = 3;
23 codepoint = lead & 0x07u;
24 } else {
25 return false;
26 }
27 if (continuation >= text.size() - index) return false;
28 for (std::size_t part = 1; part <= continuation; ++part) {
29 const auto byte = static_cast<std::uint8_t>(text[index + part]);
30 if ((byte & 0xc0u) != 0x80u) return false;
31 codepoint = (codepoint << 6u) | (byte & 0x3fu);
32 }
33 if ((continuation == 1 && codepoint < 0x80) ||
34 (continuation == 2 && codepoint < 0x800) ||
35 (continuation == 3 && codepoint < 0x10000) || codepoint > 0x10ffff ||
36 (codepoint >= 0xd800 && codepoint <= 0xdfff))
37 return false;
38 index += continuation + 1;
39 }
40 return true;
41}
42
43} // namespace eve
std::string text
uint32_t index
Strict allocation-free UTF-8 validation.
Build metadata (engine git commit, build time, third-party version).
Definition Build.cpp:16
bool isValidUtf8(std::string_view text, Utf8NullPolicy nullPolicy) noexcept
Validate shortest-form UTF-8, Unicode scalar range and optional NUL exclusion.
Utf8NullPolicy
Policy for embedded U+0000 in otherwise valid UTF-8 text.