1#ifndef NEFORCE_CORE_STRING_UTF_HPP__
2#define NEFORCE_CORE_STRING_UTF_HPP__
13NEFORCE_BEGIN_NAMESPACE__
134struct character : icharacter<character, char> {
136 using base = icharacter<character, char>;
138 constexpr character() noexcept = default;
139 NEFORCE_CONSTEXPR20 ~character() = default;
141 constexpr character(const character&) noexcept = default;
142 constexpr character(character&&) noexcept = default;
144 constexpr character& operator=(const character& other) noexcept = default;
145 constexpr character& operator=(character&& other) noexcept = default;
176 const size_t len = obj.
size();
184#if defined(NEFORCE_STANDARD_20) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
199 const size_t len = obj.
size();
222 const size_t len = obj.
size();
244 const size_t len = obj.
size();
255 using type = character;
270struct wcharacter : icharacter<wcharacter, wchar_t> {
272 using base = icharacter<wcharacter, wchar_t>;
274 constexpr wcharacter() noexcept = default;
275 NEFORCE_CONSTEXPR20 ~wcharacter() = default;
277 constexpr wcharacter(const wcharacter&) noexcept = default;
278 constexpr wcharacter(wcharacter&&) noexcept = default;
280 constexpr wcharacter& operator=(const wcharacter& other) noexcept = default;
281 constexpr wcharacter& operator=(wcharacter&& other) noexcept = default;
302#ifdef NEFORCE_PLATFORM_WINDOWS
304 while (i < obj.
size()) {
322#if defined(NEFORCE_STANDARD_20) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
334# ifdef NEFORCE_PLATFORM_WINDOWS
336 while (i < obj.
size()) {
359#ifdef NEFORCE_PLATFORM_WINDOWS
361 for (
size_t i = 0; i < obj.
size(); ++i) {
385#ifdef NEFORCE_PLATFORM_WINDOWS
387 while (i < obj.
size()) {
401 using type = wcharacter;
406 using type = wchar_t;
410#if defined(NEFORCE_STANDARD_20) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
419struct u8character : icharacter<u8character, char8_t> {
421 using base = icharacter<u8character, char8_t>;
423 constexpr u8character() noexcept = default;
424 NEFORCE_CONSTEXPR20 ~u8character() = default;
426 constexpr u8character(const u8character&) noexcept = default;
427 constexpr u8character(u8character&&) noexcept = default;
429 constexpr u8character& operator=(const u8character& other) noexcept = default;
430 constexpr u8character& operator=(u8character&& other) noexcept = default;
454 const size_t len = obj.
size();
476 const size_t len = obj.
size();
505 const size_t len = obj.
size();
527 const size_t len = obj.
size();
538 using type = u8character;
543 using type = char8_t;
555struct u16character : icharacter<u16character, char16_t> {
558 using base = icharacter<u16character, char16_t>;
561 template <
typename T>
562 static void parse_utf16_bom(
const basic_string_view<T>& obj,
size_t& start_pos,
bool& need_swap)
noexcept {
570 if (
static_cast<uint16_t>(obj[0]) == 0xFEFF) {
573 }
else if (
static_cast<uint16_t>(obj[0]) == 0xFFFE) {
610 parse_utf16_bom(obj, start_pos, need_swap);
612 size_t i = start_pos;
613 while (i < obj.
size()) {
633 parse_utf16_bom(obj, start_pos, need_swap);
635 size_t i = start_pos;
636 while (i < obj.
size()) {
642#if defined(NEFORCE_STANDARD_20) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
657 parse_utf16_bom(obj, start_pos, need_swap);
659 size_t i = start_pos;
660 while (i < obj.
size()) {
679 parse_utf16_bom(obj, start_pos, need_swap);
681 if (start_pos == 0 && !need_swap) {
688 size_t i = start_pos;
689 while (i < obj.
size()) {
709 parse_utf16_bom(obj, start_pos, need_swap);
711 size_t i = start_pos;
712 while (i < obj.
size()) {
721 using type = u16character;
726 using type = char16_t;
736struct u32character : icharacter<u32character, char32_t> {
738 using base = icharacter<u32character, char32_t>;
740 constexpr u32character() noexcept = default;
741 NEFORCE_CONSTEXPR20 ~u32character() = default;
743 constexpr u32character(const u32character&) noexcept = default;
744 constexpr u32character(u32character&&) noexcept = default;
746 constexpr u32character& operator=(const u32character& other) noexcept = default;
747 constexpr u32character& operator=(u32character&& other) noexcept = default;
790#if defined(NEFORCE_STANDARD_20) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
838 using type = u32character;
843 using type = char32_t;
850NEFORCE_END_NAMESPACE__
NEFORCE_NODISCARD constexpr size_type size() const noexcept
获取字符串长度
NEFORCE_NODISCARD constexpr const_pointer data() const noexcept
获取底层数据指针
NEFORCE_NODISCARD constexpr bool empty() const noexcept
检查是否为空
NEFORCE_CONSTEXPR20 void reserve(const size_type n)
预留容量
NEFORCE_CONSTEXPR20 void push_back(value_type value)
在末尾插入字符
static codepoint decode_utf16(const T *data, size_t &index, const size_t len, const bool need_swap) noexcept
从UTF-16序列解码一个码点,并推进索引
static constexpr codepoint from_utf32(char32_t value) noexcept
从UTF-32值直接构造码点
void append_to(string &result) const
追加UTF-8编码到string
static codepoint decode_utf8(const byte_t *data, size_t &i, size_t len) noexcept
从UTF-8字节流解码一个码点,并推进索引
unsigned char byte_t
字节类型,定义为无符号字符
unsigned int uint32_t
32位无符号整数类型
unsigned short uint16_t
16位无符号整数类型
basic_string< char16_t > u16string
UTF-16字符串
basic_string< char8_t > u8string
UTF-8字符串
basic_string< wchar_t > wstring
宽字符字符串
basic_string< char32_t > u32string
UTF-32字符串
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
icharacter< character, char > base
基类类型
static NEFORCE_CONSTEXPR20 string to_string(const basic_string_view< value_type > &obj)
转换为普通字符串
static NEFORCE_CONSTEXPR20 u32string to_u32string(const basic_string_view< value_type > &obj)
转换为UTF-32字符串
static NEFORCE_CONSTEXPR20 u8string to_u8string(const basic_string_view< value_type > &obj)
转换为UTF-8字符串
static NEFORCE_CONSTEXPR20 wstring to_wstring(const basic_string_view< value_type > &obj)
转换为宽字符串
static NEFORCE_CONSTEXPR20 u16string to_u16string(const basic_string_view< value_type > &obj)
转换为UTF-16字符串
static constexpr bool is_big_endian
编译时检测是否为大端序
static constexpr bool is_little_endian
编译时检测是否为小端序
NEFORCE_NODISCARD constexpr package_type value() const noexcept
获取数值
static NEFORCE_CONSTEXPR20 wstring to_wstring(const basic_string_view< value_type > &obj)
转换为宽字符串
static NEFORCE_CONSTEXPR20 u16string to_u16string(const basic_string_view< value_type > &obj)
转换为UTF-16字符串
static NEFORCE_CONSTEXPR20 u32string to_u32string(const basic_string_view< value_type > &obj)
转换为UTF-32字符串
static NEFORCE_CONSTEXPR20 u8string to_u8string(const basic_string_view< value_type > &obj)
转换为UTF-8字符串
icharacter< u16character, char16_t > base
基类类型
static NEFORCE_CONSTEXPR20 string to_string(const basic_string_view< value_type > &obj)
转换为普通字符串
static NEFORCE_CONSTEXPR20 u16string to_u16string(const basic_string_view< value_type > &obj)
转换为UTF-16字符串
static NEFORCE_CONSTEXPR20 u32string to_u32string(const basic_string_view< value_type > &obj)
转换为UTF-32字符串
static NEFORCE_CONSTEXPR20 u8string to_u8string(const basic_string_view< value_type > &obj)
转换为UTF-8字符串
static NEFORCE_CONSTEXPR20 wstring to_wstring(const basic_string_view< value_type > &obj)
转换为宽字符串
icharacter< u32character, char32_t > base
基类类型
static NEFORCE_CONSTEXPR20 string to_string(const basic_string_view< value_type > &obj)
转换为普通字符串
static NEFORCE_CONSTEXPR20 wstring to_wstring(const basic_string_view< value_type > &obj)
转换为宽字符串
static NEFORCE_CONSTEXPR20 u8string to_u8string(const basic_string_view< value_type > &obj)
转换为UTF-8字符串
icharacter< u8character, char8_t > base
基类类型
static NEFORCE_CONSTEXPR20 u32string to_u32string(const basic_string_view< value_type > &obj)
转换为UTF-32字符串
static NEFORCE_CONSTEXPR20 string to_string(const basic_string_view< value_type > &obj)
转换为普通字符串
static NEFORCE_CONSTEXPR20 u16string to_u16string(const basic_string_view< value_type > &obj)
转换为UTF-16字符串
static NEFORCE_CONSTEXPR20 wstring to_wstring(const basic_string_view< value_type > &obj)
转换为宽字符串
static NEFORCE_CONSTEXPR20 u32string to_u32string(const basic_string_view< value_type > &obj)
转换为UTF-32字符串
static NEFORCE_CONSTEXPR20 u16string to_u16string(const basic_string_view< value_type > &obj)
转换为UTF-16字符串
static NEFORCE_CONSTEXPR20 u8string to_u8string(const basic_string_view< value_type > &obj)
转换为UTF-8字符串
static NEFORCE_CONSTEXPR20 string to_string(const basic_string_view< value_type > &obj)
转换为普通字符串
icharacter< wcharacter, wchar_t > base
基类类型