refactor: update encoding namespace
- add all essential functions prototypes in iconv encoding. - add lost UTF convertion for windows encoding.
This commit is contained in:
@ -75,8 +75,22 @@ namespace yycc::encoding::iconv {
|
|||||||
that_iconv_close(this->inner);
|
that_iconv_close(this->inner);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
PrivToken(PrivToken&& rhs) : inner(rhs.inner) {
|
||||||
|
// Reset rhs inner
|
||||||
|
rhs.inner = INVALID_ICONV_TOKEN;
|
||||||
|
}
|
||||||
|
PrivToken& operator=(PrivToken&& rhs) {
|
||||||
|
// Free self first
|
||||||
|
if (this->inner != INVALID_ICONV_TOKEN) {
|
||||||
|
that_iconv_close(this->inner);
|
||||||
|
}
|
||||||
|
// Copy rhs inner and reset it.
|
||||||
|
this->inner = rhs.inner;
|
||||||
|
rhs.inner = INVALID_ICONV_TOKEN;
|
||||||
|
// Return self
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
YYCC_DELETE_COPY(PrivToken)
|
YYCC_DELETE_COPY(PrivToken)
|
||||||
YYCC_DEFAULT_MOVE(PrivToken)
|
|
||||||
|
|
||||||
bool is_valid() const { return this->inner != INVALID_ICONV_TOKEN; }
|
bool is_valid() const { return this->inner != INVALID_ICONV_TOKEN; }
|
||||||
that_iconv_t get_inner() const { return this->inner; }
|
that_iconv_t get_inner() const { return this->inner; }
|
||||||
|
@ -50,6 +50,145 @@ namespace yycc::encoding::iconv {
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
using ConvResult = NS_YYCC_PATCH_EXPECTED::Expected<T, ConvError>;
|
using ConvResult = NS_YYCC_PATCH_EXPECTED::Expected<T, ConvError>;
|
||||||
|
|
||||||
|
// TODO: 为下列类添加注释时,指明static开头的是一次性使用的,适用于转换一两次结束。
|
||||||
|
// 用实例类的适用于需要持续转换的。
|
||||||
|
|
||||||
|
// Char -> UTF8
|
||||||
|
class CharToUtf8 {
|
||||||
|
public:
|
||||||
|
CharToUtf8(const CodeName& code_name);
|
||||||
|
~CharToUtf8();
|
||||||
|
YYCC_DELETE_COPY(CharToUtf8)
|
||||||
|
YYCC_DEFAULT_MOVE(CharToUtf8)
|
||||||
|
|
||||||
|
public:
|
||||||
|
ConvResult<NS_YYCC_STRING::u8string> priv_to_utf8(const std::string_view& src);
|
||||||
|
bool to_utf8(const std::string_view& src, NS_YYCC_STRING::u8string& dst);
|
||||||
|
NS_YYCC_STRING::u8string to_utf8(const std::string_view& src);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Token token;
|
||||||
|
};
|
||||||
|
|
||||||
|
// UTF8 -> Char
|
||||||
|
class Utf8ToChar {
|
||||||
|
public:
|
||||||
|
Utf8ToChar(const CodeName& code_name);
|
||||||
|
~Utf8ToChar();
|
||||||
|
YYCC_DELETE_COPY(Utf8ToChar)
|
||||||
|
YYCC_DEFAULT_MOVE(Utf8ToChar)
|
||||||
|
|
||||||
|
public:
|
||||||
|
ConvResult<std::string> priv_to_char(const NS_YYCC_STRING::u8string_view& src);
|
||||||
|
bool to_char(const NS_YYCC_STRING::u8string_view& src, std::string& dst);
|
||||||
|
std::string to_char(const NS_YYCC_STRING::u8string_view& src);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Token token;
|
||||||
|
};
|
||||||
|
|
||||||
|
// WChar -> Char
|
||||||
|
class WcharToChar {
|
||||||
|
public:
|
||||||
|
WcharToChar(const CodeName& code_name);
|
||||||
|
~WcharToChar();
|
||||||
|
YYCC_DELETE_COPY(WcharToChar)
|
||||||
|
YYCC_DEFAULT_MOVE(WcharToChar)
|
||||||
|
|
||||||
|
public:
|
||||||
|
ConvResult<std::string> priv_to_char(const std::wstring_view& src);
|
||||||
|
bool to_char(const std::wstring_view& src, std::string& dst);
|
||||||
|
std::string to_char(const std::wstring_view& src);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Token token;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Char -> WChar
|
||||||
|
class CharToWchar {
|
||||||
|
public:
|
||||||
|
CharToWchar(const CodeName& code_name);
|
||||||
|
~CharToWchar();
|
||||||
|
YYCC_DELETE_COPY(CharToWchar)
|
||||||
|
YYCC_DEFAULT_MOVE(CharToWchar)
|
||||||
|
|
||||||
|
public:
|
||||||
|
ConvResult<std::wstring> priv_to_wchar(const std::string_view& src, const CodeName& code_name);
|
||||||
|
bool to_wchar(const std::string_view& src, std::wstring& dst, const CodeName& code_name);
|
||||||
|
std::wstring to_wchar(const std::string_view& src, const CodeName& code_name);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Token token;
|
||||||
|
};
|
||||||
|
|
||||||
|
// UTF8 -> UTF16
|
||||||
|
class Utf8ToUtf16 {
|
||||||
|
public:
|
||||||
|
Utf8ToUtf16();
|
||||||
|
~Utf8ToUtf16();
|
||||||
|
YYCC_DELETE_COPY(Utf8ToUtf16)
|
||||||
|
YYCC_DEFAULT_MOVE(Utf8ToUtf16)
|
||||||
|
|
||||||
|
public:
|
||||||
|
ConvResult<std::u16string> priv_to_utf16(const NS_YYCC_STRING::u8string_view& src);
|
||||||
|
bool to_utf16(const NS_YYCC_STRING::u8string_view& src, std::u16string& dst);
|
||||||
|
std::u16string to_utf16(const NS_YYCC_STRING::u8string_view& src);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Token token;
|
||||||
|
};
|
||||||
|
|
||||||
|
// UTF16 -> UTF8
|
||||||
|
class Utf16ToUtf8 {
|
||||||
|
public:
|
||||||
|
Utf16ToUtf8();
|
||||||
|
~Utf16ToUtf8();
|
||||||
|
YYCC_DELETE_COPY(Utf16ToUtf8)
|
||||||
|
YYCC_DEFAULT_MOVE(Utf16ToUtf8)
|
||||||
|
|
||||||
|
public:
|
||||||
|
ConvResult<NS_YYCC_STRING::u8string> priv_to_utf8(const std::u16string_view& src);
|
||||||
|
bool to_utf8(const std::u16string_view& src, NS_YYCC_STRING::u8string& dst);
|
||||||
|
NS_YYCC_STRING::u8string to_utf8(const std::u16string_view& src);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Token token;
|
||||||
|
};
|
||||||
|
|
||||||
|
// UTF8 -> UTF32
|
||||||
|
class Utf8ToUtf32 {
|
||||||
|
public:
|
||||||
|
Utf8ToUtf32();
|
||||||
|
~Utf8ToUtf32();
|
||||||
|
YYCC_DELETE_COPY(Utf8ToUtf32)
|
||||||
|
YYCC_DEFAULT_MOVE(Utf8ToUtf32)
|
||||||
|
|
||||||
|
public:
|
||||||
|
ConvResult<std::u32string> priv_to_utf32(const NS_YYCC_STRING::u8string_view& src);
|
||||||
|
bool to_utf32(const NS_YYCC_STRING::u8string_view& src, std::u32string& dst);
|
||||||
|
std::u32string to_utf32(const NS_YYCC_STRING::u8string_view& src);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Token token;
|
||||||
|
};
|
||||||
|
|
||||||
|
// UTF32 -> UTF8
|
||||||
|
class Utf32ToUtf8 {
|
||||||
|
public:
|
||||||
|
Utf32ToUtf8();
|
||||||
|
~Utf32ToUtf8();
|
||||||
|
YYCC_DELETE_COPY(Utf32ToUtf8)
|
||||||
|
YYCC_DEFAULT_MOVE(Utf32ToUtf8)
|
||||||
|
|
||||||
|
public:
|
||||||
|
ConvResult<NS_YYCC_STRING::u8string> priv_to_utf8(const std::u32string_view& src);
|
||||||
|
bool to_utf8(const std::u32string_view& src, NS_YYCC_STRING::u8string& dst);
|
||||||
|
NS_YYCC_STRING::u8string to_utf8(const std::u32string_view& src);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Token token;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace yycc::encoding::iconv
|
} // namespace yycc::encoding::iconv
|
||||||
|
|
||||||
#undef NS_YYCC_PATCH_EXPECTED
|
#undef NS_YYCC_PATCH_EXPECTED
|
||||||
|
@ -15,25 +15,21 @@ namespace yycc::encoding::utf {
|
|||||||
using ConvResult = NS_YYCC_PATCH_EXPECTED::Expected<T, ConvError>;
|
using ConvResult = NS_YYCC_PATCH_EXPECTED::Expected<T, ConvError>;
|
||||||
|
|
||||||
// UTF8 -> UTF16
|
// UTF8 -> UTF16
|
||||||
|
|
||||||
ConvResult<std::u16string> priv_to_utf16(const NS_YYCC_STRING::u8string_view& src);
|
ConvResult<std::u16string> priv_to_utf16(const NS_YYCC_STRING::u8string_view& src);
|
||||||
bool to_utf16(const NS_YYCC_STRING::u8string_view& src, std::u16string& dst);
|
bool to_utf16(const NS_YYCC_STRING::u8string_view& src, std::u16string& dst);
|
||||||
std::u16string to_utf16(const NS_YYCC_STRING::u8string_view& src);
|
std::u16string to_utf16(const NS_YYCC_STRING::u8string_view& src);
|
||||||
|
|
||||||
// UTF16 -> UTF8
|
// UTF16 -> UTF8
|
||||||
|
|
||||||
ConvResult<NS_YYCC_STRING::u8string> priv_to_utf8(const std::u16string_view& src);
|
ConvResult<NS_YYCC_STRING::u8string> priv_to_utf8(const std::u16string_view& src);
|
||||||
bool to_utf8(const std::u16string_view& src, NS_YYCC_STRING::u8string& dst);
|
bool to_utf8(const std::u16string_view& src, NS_YYCC_STRING::u8string& dst);
|
||||||
NS_YYCC_STRING::u8string to_utf8(const std::u16string_view& src);
|
NS_YYCC_STRING::u8string to_utf8(const std::u16string_view& src);
|
||||||
|
|
||||||
// UTF8 -> UTF32
|
// UTF8 -> UTF32
|
||||||
|
|
||||||
ConvResult<std::u32string> priv_to_utf32(const NS_YYCC_STRING::u8string_view& src);
|
ConvResult<std::u32string> priv_to_utf32(const NS_YYCC_STRING::u8string_view& src);
|
||||||
bool to_utf32(const NS_YYCC_STRING::u8string_view& src, std::u32string& dst);
|
bool to_utf32(const NS_YYCC_STRING::u8string_view& src, std::u32string& dst);
|
||||||
std::u32string to_utf32(const NS_YYCC_STRING::u8string_view& src);
|
std::u32string to_utf32(const NS_YYCC_STRING::u8string_view& src);
|
||||||
|
|
||||||
// UTF32 -> UTF8
|
// UTF32 -> UTF8
|
||||||
|
|
||||||
ConvResult<NS_YYCC_STRING::u8string> priv_to_utf8(const std::u32string_view& src);
|
ConvResult<NS_YYCC_STRING::u8string> priv_to_utf8(const std::u32string_view& src);
|
||||||
bool to_utf8(const std::u32string_view& src, NS_YYCC_STRING::u8string& dst);
|
bool to_utf8(const std::u32string_view& src, NS_YYCC_STRING::u8string& dst);
|
||||||
NS_YYCC_STRING::u8string to_utf8(const std::u32string_view& src);
|
NS_YYCC_STRING::u8string to_utf8(const std::u32string_view& src);
|
||||||
|
@ -241,9 +241,13 @@ namespace yycc::encoding::windows {
|
|||||||
|
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|
||||||
|
// YYC MARK:
|
||||||
|
// The convertion between UTF is implemented by c16rtomb, c32rtomb, mbrtoc16 and mbrtoc32.
|
||||||
|
// These function is locale related in C++ standard, but in Microsoft STL, it's only for UTF8.
|
||||||
|
// So we can use them safely in Win32 environment.
|
||||||
|
|
||||||
#undef CONVFN_TYPE1
|
#undef CONVFN_TYPE1
|
||||||
#undef CONVFN_TYPE2
|
#undef CONVFN_TYPE2
|
||||||
#undef CONVFCT_TYPE4
|
|
||||||
|
|
||||||
} // namespace yycc::encoding::windows
|
} // namespace yycc::encoding::windows
|
||||||
|
|
||||||
|
@ -65,6 +65,26 @@ namespace yycc::encoding::windows {
|
|||||||
bool to_char(const NS_YYCC_STRING::u8string_view& src, std::string& dst, CodePage code_page);
|
bool to_char(const NS_YYCC_STRING::u8string_view& src, std::string& dst, CodePage code_page);
|
||||||
std::string to_char(const NS_YYCC_STRING::u8string_view& src, CodePage code_page);
|
std::string to_char(const NS_YYCC_STRING::u8string_view& src, CodePage code_page);
|
||||||
|
|
||||||
|
// UTF8 -> UTF16
|
||||||
|
ConvResult<std::u16string> priv_to_utf16(const NS_YYCC_STRING::u8string_view& src);
|
||||||
|
bool to_utf16(const NS_YYCC_STRING::u8string_view& src, std::u16string& dst);
|
||||||
|
std::u16string to_utf16(const NS_YYCC_STRING::u8string_view& src);
|
||||||
|
|
||||||
|
// UTF16 -> UTF8
|
||||||
|
ConvResult<NS_YYCC_STRING::u8string> priv_to_utf8(const std::u16string_view& src);
|
||||||
|
bool to_utf8(const std::u16string_view& src, NS_YYCC_STRING::u8string& dst);
|
||||||
|
NS_YYCC_STRING::u8string to_utf8(const std::u16string_view& src);
|
||||||
|
|
||||||
|
// UTF8 -> UTF32
|
||||||
|
ConvResult<std::u32string> priv_to_utf32(const NS_YYCC_STRING::u8string_view& src);
|
||||||
|
bool to_utf32(const NS_YYCC_STRING::u8string_view& src, std::u32string& dst);
|
||||||
|
std::u32string to_utf32(const NS_YYCC_STRING::u8string_view& src);
|
||||||
|
|
||||||
|
// UTF32 -> UTF8
|
||||||
|
ConvResult<NS_YYCC_STRING::u8string> priv_to_utf8(const std::u32string_view& src);
|
||||||
|
bool to_utf8(const std::u32string_view& src, NS_YYCC_STRING::u8string& dst);
|
||||||
|
NS_YYCC_STRING::u8string to_utf8(const std::u32string_view& src);
|
||||||
|
|
||||||
} // namespace yycc::encoding::windows
|
} // namespace yycc::encoding::windows
|
||||||
|
|
||||||
#undef NS_YYCC_PATCH_EXPECTED
|
#undef NS_YYCC_PATCH_EXPECTED
|
||||||
|
Reference in New Issue
Block a user