feat: update pycodec.

- rename encoding::utf to encoding::stlcvt.
- use uv to manage script and add pycodec generator script.
- update script in modern python.
- fix added pycodec generator.
This commit is contained in:
2025-07-23 16:05:53 +08:00
parent 821a592f02
commit f014e54604
15 changed files with 1148 additions and 41 deletions

View File

@ -15,7 +15,7 @@ PRIVATE
yycc/string/op.cpp
yycc/rust/panic.cpp
yycc/patch/path.cpp
yycc/encoding/utf.cpp
yycc/encoding/stlcvt.cpp
yycc/encoding/windows.cpp
yycc/encoding/iconv.cpp
yycc/encoding/pycodec.cpp
@ -68,7 +68,7 @@ FILES
yycc/patch/contains.hpp
yycc/patch/starts_ends_with.hpp
yycc/patch/expected.hpp
yycc/encoding/utf.hpp
yycc/encoding/stlcvt.hpp
yycc/encoding/windows.hpp
yycc/encoding/iconv.hpp
yycc/encoding/pycodec.hpp

View File

@ -0,0 +1,446 @@
#include "pycodec.hpp"
#include <map>
#define NS_YYCC_STRING ::yycc::string
#define NS_YYCC_PATCH_EXPECTED ::yycc::patch::expected
namespace yycc::encoding::pycodec {
#pragma region Encoding Name
static const std::map<NS_YYCC_STRING::u8string, NS_YYCC_STRING::u8string> ALISA_MAP {
{ YYCC_U8("646"), YYCC_U8("ascii") },
{ YYCC_U8("us-ascii"), YYCC_U8("ascii") },
{ YYCC_U8("big5-tw"), YYCC_U8("big5") },
{ YYCC_U8("csbig5"), YYCC_U8("big5") },
{ YYCC_U8("big5-hkscs"), YYCC_U8("big5hkscs") },
{ YYCC_U8("hkscs"), YYCC_U8("big5hkscs") },
{ YYCC_U8("ibm037"), YYCC_U8("cp037") },
{ YYCC_U8("ibm039"), YYCC_U8("cp037") },
{ YYCC_U8("273"), YYCC_U8("cp273") },
{ YYCC_U8("ibm273"), YYCC_U8("cp273") },
{ YYCC_U8("csibm273"), YYCC_U8("cp273") },
{ YYCC_U8("ebcdic-cp-he"), YYCC_U8("cp424") },
{ YYCC_U8("ibm424"), YYCC_U8("cp424") },
{ YYCC_U8("437"), YYCC_U8("cp437") },
{ YYCC_U8("ibm437"), YYCC_U8("cp437") },
{ YYCC_U8("ebcdic-cp-be"), YYCC_U8("cp500") },
{ YYCC_U8("ebcdic-cp-ch"), YYCC_U8("cp500") },
{ YYCC_U8("ibm500"), YYCC_U8("cp500") },
{ YYCC_U8("ibm775"), YYCC_U8("cp775") },
{ YYCC_U8("850"), YYCC_U8("cp850") },
{ YYCC_U8("ibm850"), YYCC_U8("cp850") },
{ YYCC_U8("852"), YYCC_U8("cp852") },
{ YYCC_U8("ibm852"), YYCC_U8("cp852") },
{ YYCC_U8("855"), YYCC_U8("cp855") },
{ YYCC_U8("ibm855"), YYCC_U8("cp855") },
{ YYCC_U8("857"), YYCC_U8("cp857") },
{ YYCC_U8("ibm857"), YYCC_U8("cp857") },
{ YYCC_U8("858"), YYCC_U8("cp858") },
{ YYCC_U8("ibm858"), YYCC_U8("cp858") },
{ YYCC_U8("860"), YYCC_U8("cp860") },
{ YYCC_U8("ibm860"), YYCC_U8("cp860") },
{ YYCC_U8("861"), YYCC_U8("cp861") },
{ YYCC_U8("cp-is"), YYCC_U8("cp861") },
{ YYCC_U8("ibm861"), YYCC_U8("cp861") },
{ YYCC_U8("862"), YYCC_U8("cp862") },
{ YYCC_U8("ibm862"), YYCC_U8("cp862") },
{ YYCC_U8("863"), YYCC_U8("cp863") },
{ YYCC_U8("ibm863"), YYCC_U8("cp863") },
{ YYCC_U8("ibm864"), YYCC_U8("cp864") },
{ YYCC_U8("865"), YYCC_U8("cp865") },
{ YYCC_U8("ibm865"), YYCC_U8("cp865") },
{ YYCC_U8("866"), YYCC_U8("cp866") },
{ YYCC_U8("ibm866"), YYCC_U8("cp866") },
{ YYCC_U8("869"), YYCC_U8("cp869") },
{ YYCC_U8("cp-gr"), YYCC_U8("cp869") },
{ YYCC_U8("ibm869"), YYCC_U8("cp869") },
{ YYCC_U8("932"), YYCC_U8("cp932") },
{ YYCC_U8("ms932"), YYCC_U8("cp932") },
{ YYCC_U8("mskanji"), YYCC_U8("cp932") },
{ YYCC_U8("ms-kanji"), YYCC_U8("cp932") },
{ YYCC_U8("windows-31j"), YYCC_U8("cp932") },
{ YYCC_U8("949"), YYCC_U8("cp949") },
{ YYCC_U8("ms949"), YYCC_U8("cp949") },
{ YYCC_U8("uhc"), YYCC_U8("cp949") },
{ YYCC_U8("950"), YYCC_U8("cp950") },
{ YYCC_U8("ms950"), YYCC_U8("cp950") },
{ YYCC_U8("ibm1026"), YYCC_U8("cp1026") },
{ YYCC_U8("1125"), YYCC_U8("cp1125") },
{ YYCC_U8("ibm1125"), YYCC_U8("cp1125") },
{ YYCC_U8("cp866u"), YYCC_U8("cp1125") },
{ YYCC_U8("ruscii"), YYCC_U8("cp1125") },
{ YYCC_U8("ibm1140"), YYCC_U8("cp1140") },
{ YYCC_U8("windows-1250"), YYCC_U8("cp1250") },
{ YYCC_U8("windows-1251"), YYCC_U8("cp1251") },
{ YYCC_U8("windows-1252"), YYCC_U8("cp1252") },
{ YYCC_U8("windows-1253"), YYCC_U8("cp1253") },
{ YYCC_U8("windows-1254"), YYCC_U8("cp1254") },
{ YYCC_U8("windows-1255"), YYCC_U8("cp1255") },
{ YYCC_U8("windows-1256"), YYCC_U8("cp1256") },
{ YYCC_U8("windows-1257"), YYCC_U8("cp1257") },
{ YYCC_U8("windows-1258"), YYCC_U8("cp1258") },
{ YYCC_U8("eucjp"), YYCC_U8("euc_jp") },
{ YYCC_U8("ujis"), YYCC_U8("euc_jp") },
{ YYCC_U8("u-jis"), YYCC_U8("euc_jp") },
{ YYCC_U8("jisx0213"), YYCC_U8("euc_jis_2004") },
{ YYCC_U8("eucjis2004"), YYCC_U8("euc_jis_2004") },
{ YYCC_U8("eucjisx0213"), YYCC_U8("euc_jisx0213") },
{ YYCC_U8("euckr"), YYCC_U8("euc_kr") },
{ YYCC_U8("korean"), YYCC_U8("euc_kr") },
{ YYCC_U8("ksc5601"), YYCC_U8("euc_kr") },
{ YYCC_U8("ks_c-5601"), YYCC_U8("euc_kr") },
{ YYCC_U8("ks_c-5601-1987"), YYCC_U8("euc_kr") },
{ YYCC_U8("ksx1001"), YYCC_U8("euc_kr") },
{ YYCC_U8("ks_x-1001"), YYCC_U8("euc_kr") },
{ YYCC_U8("chinese"), YYCC_U8("gb2312") },
{ YYCC_U8("csiso58gb231280"), YYCC_U8("gb2312") },
{ YYCC_U8("euc-cn"), YYCC_U8("gb2312") },
{ YYCC_U8("euccn"), YYCC_U8("gb2312") },
{ YYCC_U8("eucgb2312-cn"), YYCC_U8("gb2312") },
{ YYCC_U8("gb2312-1980"), YYCC_U8("gb2312") },
{ YYCC_U8("gb2312-80"), YYCC_U8("gb2312") },
{ YYCC_U8("iso-ir-58"), YYCC_U8("gb2312") },
{ YYCC_U8("936"), YYCC_U8("gbk") },
{ YYCC_U8("cp936"), YYCC_U8("gbk") },
{ YYCC_U8("ms936"), YYCC_U8("gbk") },
{ YYCC_U8("gb18030-2000"), YYCC_U8("gb18030") },
{ YYCC_U8("hzgb"), YYCC_U8("hz") },
{ YYCC_U8("hz-gb"), YYCC_U8("hz") },
{ YYCC_U8("hz-gb-2312"), YYCC_U8("hz") },
{ YYCC_U8("csiso2022jp"), YYCC_U8("iso2022_jp") },
{ YYCC_U8("iso2022jp"), YYCC_U8("iso2022_jp") },
{ YYCC_U8("iso-2022-jp"), YYCC_U8("iso2022_jp") },
{ YYCC_U8("iso2022jp-1"), YYCC_U8("iso2022_jp_1") },
{ YYCC_U8("iso-2022-jp-1"), YYCC_U8("iso2022_jp_1") },
{ YYCC_U8("iso2022jp-2"), YYCC_U8("iso2022_jp_2") },
{ YYCC_U8("iso-2022-jp-2"), YYCC_U8("iso2022_jp_2") },
{ YYCC_U8("iso2022jp-2004"), YYCC_U8("iso2022_jp_2004") },
{ YYCC_U8("iso-2022-jp-2004"), YYCC_U8("iso2022_jp_2004") },
{ YYCC_U8("iso2022jp-3"), YYCC_U8("iso2022_jp_3") },
{ YYCC_U8("iso-2022-jp-3"), YYCC_U8("iso2022_jp_3") },
{ YYCC_U8("iso2022jp-ext"), YYCC_U8("iso2022_jp_ext") },
{ YYCC_U8("iso-2022-jp-ext"), YYCC_U8("iso2022_jp_ext") },
{ YYCC_U8("csiso2022kr"), YYCC_U8("iso2022_kr") },
{ YYCC_U8("iso2022kr"), YYCC_U8("iso2022_kr") },
{ YYCC_U8("iso-2022-kr"), YYCC_U8("iso2022_kr") },
{ YYCC_U8("iso-8859-1"), YYCC_U8("latin_1") },
{ YYCC_U8("iso8859-1"), YYCC_U8("latin_1") },
{ YYCC_U8("8859"), YYCC_U8("latin_1") },
{ YYCC_U8("cp819"), YYCC_U8("latin_1") },
{ YYCC_U8("latin"), YYCC_U8("latin_1") },
{ YYCC_U8("latin1"), YYCC_U8("latin_1") },
{ YYCC_U8("l1"), YYCC_U8("latin_1") },
{ YYCC_U8("iso-8859-2"), YYCC_U8("iso8859_2") },
{ YYCC_U8("latin2"), YYCC_U8("iso8859_2") },
{ YYCC_U8("l2"), YYCC_U8("iso8859_2") },
{ YYCC_U8("iso-8859-3"), YYCC_U8("iso8859_3") },
{ YYCC_U8("latin3"), YYCC_U8("iso8859_3") },
{ YYCC_U8("l3"), YYCC_U8("iso8859_3") },
{ YYCC_U8("iso-8859-4"), YYCC_U8("iso8859_4") },
{ YYCC_U8("latin4"), YYCC_U8("iso8859_4") },
{ YYCC_U8("l4"), YYCC_U8("iso8859_4") },
{ YYCC_U8("iso-8859-5"), YYCC_U8("iso8859_5") },
{ YYCC_U8("cyrillic"), YYCC_U8("iso8859_5") },
{ YYCC_U8("iso-8859-6"), YYCC_U8("iso8859_6") },
{ YYCC_U8("arabic"), YYCC_U8("iso8859_6") },
{ YYCC_U8("iso-8859-7"), YYCC_U8("iso8859_7") },
{ YYCC_U8("greek"), YYCC_U8("iso8859_7") },
{ YYCC_U8("greek8"), YYCC_U8("iso8859_7") },
{ YYCC_U8("iso-8859-8"), YYCC_U8("iso8859_8") },
{ YYCC_U8("hebrew"), YYCC_U8("iso8859_8") },
{ YYCC_U8("iso-8859-9"), YYCC_U8("iso8859_9") },
{ YYCC_U8("latin5"), YYCC_U8("iso8859_9") },
{ YYCC_U8("l5"), YYCC_U8("iso8859_9") },
{ YYCC_U8("iso-8859-10"), YYCC_U8("iso8859_10") },
{ YYCC_U8("latin6"), YYCC_U8("iso8859_10") },
{ YYCC_U8("l6"), YYCC_U8("iso8859_10") },
{ YYCC_U8("iso-8859-11"), YYCC_U8("iso8859_11") },
{ YYCC_U8("thai"), YYCC_U8("iso8859_11") },
{ YYCC_U8("iso-8859-13"), YYCC_U8("iso8859_13") },
{ YYCC_U8("latin7"), YYCC_U8("iso8859_13") },
{ YYCC_U8("l7"), YYCC_U8("iso8859_13") },
{ YYCC_U8("iso-8859-14"), YYCC_U8("iso8859_14") },
{ YYCC_U8("latin8"), YYCC_U8("iso8859_14") },
{ YYCC_U8("l8"), YYCC_U8("iso8859_14") },
{ YYCC_U8("iso-8859-15"), YYCC_U8("iso8859_15") },
{ YYCC_U8("latin9"), YYCC_U8("iso8859_15") },
{ YYCC_U8("l9"), YYCC_U8("iso8859_15") },
{ YYCC_U8("iso-8859-16"), YYCC_U8("iso8859_16") },
{ YYCC_U8("latin10"), YYCC_U8("iso8859_16") },
{ YYCC_U8("l10"), YYCC_U8("iso8859_16") },
{ YYCC_U8("cp1361"), YYCC_U8("johab") },
{ YYCC_U8("ms1361"), YYCC_U8("johab") },
{ YYCC_U8("kz_1048"), YYCC_U8("kz1048") },
{ YYCC_U8("strk1048_2002"), YYCC_U8("kz1048") },
{ YYCC_U8("rk1048"), YYCC_U8("kz1048") },
{ YYCC_U8("maccyrillic"), YYCC_U8("mac_cyrillic") },
{ YYCC_U8("macgreek"), YYCC_U8("mac_greek") },
{ YYCC_U8("maciceland"), YYCC_U8("mac_iceland") },
{ YYCC_U8("maclatin2"), YYCC_U8("mac_latin2") },
{ YYCC_U8("maccentraleurope"), YYCC_U8("mac_latin2") },
{ YYCC_U8("mac_centeuro"), YYCC_U8("mac_latin2") },
{ YYCC_U8("macroman"), YYCC_U8("mac_roman") },
{ YYCC_U8("macintosh"), YYCC_U8("mac_roman") },
{ YYCC_U8("macturkish"), YYCC_U8("mac_turkish") },
{ YYCC_U8("csptcp154"), YYCC_U8("ptcp154") },
{ YYCC_U8("pt154"), YYCC_U8("ptcp154") },
{ YYCC_U8("cp154"), YYCC_U8("ptcp154") },
{ YYCC_U8("cyrillic-asian"), YYCC_U8("ptcp154") },
{ YYCC_U8("csshiftjis"), YYCC_U8("shift_jis") },
{ YYCC_U8("shiftjis"), YYCC_U8("shift_jis") },
{ YYCC_U8("sjis"), YYCC_U8("shift_jis") },
{ YYCC_U8("s_jis"), YYCC_U8("shift_jis") },
{ YYCC_U8("shiftjis2004"), YYCC_U8("shift_jis_2004") },
{ YYCC_U8("sjis_2004"), YYCC_U8("shift_jis_2004") },
{ YYCC_U8("sjis2004"), YYCC_U8("shift_jis_2004") },
{ YYCC_U8("shiftjisx0213"), YYCC_U8("shift_jisx0213") },
{ YYCC_U8("sjisx0213"), YYCC_U8("shift_jisx0213") },
{ YYCC_U8("s_jisx0213"), YYCC_U8("shift_jisx0213") },
{ YYCC_U8("u32"), YYCC_U8("utf_32") },
{ YYCC_U8("utf32"), YYCC_U8("utf_32") },
{ YYCC_U8("utf-32be"), YYCC_U8("utf_32_be") },
{ YYCC_U8("utf-32le"), YYCC_U8("utf_32_le") },
{ YYCC_U8("u16"), YYCC_U8("utf_16") },
{ YYCC_U8("utf16"), YYCC_U8("utf_16") },
{ YYCC_U8("utf-16be"), YYCC_U8("utf_16_be") },
{ YYCC_U8("utf-16le"), YYCC_U8("utf_16_le") },
{ YYCC_U8("u7"), YYCC_U8("utf_7") },
{ YYCC_U8("unicode-1-1-utf-7"), YYCC_U8("utf_7") },
{ YYCC_U8("u8"), YYCC_U8("utf_8") },
{ YYCC_U8("utf"), YYCC_U8("utf_8") },
{ YYCC_U8("utf8"), YYCC_U8("utf_8") },
{ YYCC_U8("utf-8"), YYCC_U8("utf_8") },
{ YYCC_U8("cp65001"), YYCC_U8("utf_8") },
};
#if defined(YYCC_PYCODEC_WIN32_BACKEND)
using CodePage = NS_YYCC_ENCODING_BACKEND::CodePage;
static const std::map<NS_YYCC_STRING::u8string, CodePage> WINCP_MAP {
{ YYCC_U8("ascii"), static_cast<CodePage>(437u) },
{ YYCC_U8("big5"), static_cast<CodePage>(950u) },
{ YYCC_U8("cp037"), static_cast<CodePage>(037u) },
{ YYCC_U8("cp437"), static_cast<CodePage>(437u) },
{ YYCC_U8("cp500"), static_cast<CodePage>(500u) },
{ YYCC_U8("cp720"), static_cast<CodePage>(720u) },
{ YYCC_U8("cp737"), static_cast<CodePage>(737u) },
{ YYCC_U8("cp775"), static_cast<CodePage>(775u) },
{ YYCC_U8("cp850"), static_cast<CodePage>(850u) },
{ YYCC_U8("cp852"), static_cast<CodePage>(852u) },
{ YYCC_U8("cp855"), static_cast<CodePage>(855u) },
{ YYCC_U8("cp857"), static_cast<CodePage>(857u) },
{ YYCC_U8("cp858"), static_cast<CodePage>(858u) },
{ YYCC_U8("cp860"), static_cast<CodePage>(860u) },
{ YYCC_U8("cp861"), static_cast<CodePage>(861u) },
{ YYCC_U8("cp862"), static_cast<CodePage>(862u) },
{ YYCC_U8("cp863"), static_cast<CodePage>(863u) },
{ YYCC_U8("cp864"), static_cast<CodePage>(864u) },
{ YYCC_U8("cp865"), static_cast<CodePage>(865u) },
{ YYCC_U8("cp866"), static_cast<CodePage>(866u) },
{ YYCC_U8("cp869"), static_cast<CodePage>(869u) },
{ YYCC_U8("cp874"), static_cast<CodePage>(874u) },
{ YYCC_U8("cp875"), static_cast<CodePage>(875u) },
{ YYCC_U8("cp932"), static_cast<CodePage>(932u) },
{ YYCC_U8("cp949"), static_cast<CodePage>(949u) },
{ YYCC_U8("cp950"), static_cast<CodePage>(950u) },
{ YYCC_U8("cp1026"), static_cast<CodePage>(1026u) },
{ YYCC_U8("cp1140"), static_cast<CodePage>(1140u) },
{ YYCC_U8("cp1250"), static_cast<CodePage>(1250u) },
{ YYCC_U8("cp1251"), static_cast<CodePage>(1251u) },
{ YYCC_U8("cp1252"), static_cast<CodePage>(1252u) },
{ YYCC_U8("cp1253"), static_cast<CodePage>(1253u) },
{ YYCC_U8("cp1254"), static_cast<CodePage>(1254u) },
{ YYCC_U8("cp1255"), static_cast<CodePage>(1255u) },
{ YYCC_U8("cp1256"), static_cast<CodePage>(1256u) },
{ YYCC_U8("cp1257"), static_cast<CodePage>(1257u) },
{ YYCC_U8("cp1258"), static_cast<CodePage>(1258u) },
{ YYCC_U8("euc_jp"), static_cast<CodePage>(20932u) },
{ YYCC_U8("euc_kr"), static_cast<CodePage>(51949u) },
{ YYCC_U8("gb2312"), static_cast<CodePage>(936u) },
{ YYCC_U8("gbk"), static_cast<CodePage>(936u) },
{ YYCC_U8("gb18030"), static_cast<CodePage>(54936u) },
{ YYCC_U8("hz"), static_cast<CodePage>(52936u) },
{ YYCC_U8("iso2022_jp"), static_cast<CodePage>(50220u) },
{ YYCC_U8("iso2022_kr"), static_cast<CodePage>(50225u) },
{ YYCC_U8("latin_1"), static_cast<CodePage>(28591u) },
{ YYCC_U8("iso8859_2"), static_cast<CodePage>(28592u) },
{ YYCC_U8("iso8859_3"), static_cast<CodePage>(28593u) },
{ YYCC_U8("iso8859_4"), static_cast<CodePage>(28594u) },
{ YYCC_U8("iso8859_5"), static_cast<CodePage>(28595u) },
{ YYCC_U8("iso8859_6"), static_cast<CodePage>(28596u) },
{ YYCC_U8("iso8859_7"), static_cast<CodePage>(28597u) },
{ YYCC_U8("iso8859_8"), static_cast<CodePage>(28598u) },
{ YYCC_U8("iso8859_9"), static_cast<CodePage>(28599u) },
{ YYCC_U8("iso8859_13"), static_cast<CodePage>(28603u) },
{ YYCC_U8("iso8859_15"), static_cast<CodePage>(28605u) },
{ YYCC_U8("johab"), static_cast<CodePage>(1361u) },
{ YYCC_U8("mac_cyrillic"), static_cast<CodePage>(10007u) },
{ YYCC_U8("mac_greek"), static_cast<CodePage>(10006u) },
{ YYCC_U8("mac_iceland"), static_cast<CodePage>(10079u) },
{ YYCC_U8("mac_turkish"), static_cast<CodePage>(10081u) },
{ YYCC_U8("shift_jis"), static_cast<CodePage>(932u) },
{ YYCC_U8("utf_7"), static_cast<CodePage>(65000u) },
{ YYCC_U8("utf_8"), static_cast<CodePage>(65001u) },
};
#else
static const std::map<NS_YYCC_STRING::u8string, std::string> ICONV_MAP {
{ YYCC_U8("ascii"), "ASCII" },
{ YYCC_U8("big5"), "BIG5" },
{ YYCC_U8("big5hkscs"), "BIG5-HKSCS" },
{ YYCC_U8("cp850"), "CP850" },
{ YYCC_U8("cp862"), "CP862" },
{ YYCC_U8("cp866"), "CP866" },
{ YYCC_U8("cp874"), "CP874" },
{ YYCC_U8("cp932"), "CP932" },
{ YYCC_U8("cp949"), "CP949" },
{ YYCC_U8("cp950"), "CP950" },
{ YYCC_U8("cp1250"), "CP1250" },
{ YYCC_U8("cp1251"), "CP1251" },
{ YYCC_U8("cp1252"), "CP1252" },
{ YYCC_U8("cp1253"), "CP1253" },
{ YYCC_U8("cp1254"), "CP1254" },
{ YYCC_U8("cp1255"), "CP1255" },
{ YYCC_U8("cp1256"), "CP1256" },
{ YYCC_U8("cp1257"), "CP1257" },
{ YYCC_U8("cp1258"), "CP1258" },
{ YYCC_U8("euc_jp"), "EUC-JP" },
{ YYCC_U8("euc_kr"), "EUC-KR" },
{ YYCC_U8("gb2312"), "CP936" },
{ YYCC_U8("gbk"), "GBK" },
{ YYCC_U8("gb18030"), "GB18030" },
{ YYCC_U8("hz"), "HZ" },
{ YYCC_U8("iso2022_jp"), "ISO-2022-JP" },
{ YYCC_U8("iso2022_jp_1"), "ISO-2022-JP-1" },
{ YYCC_U8("iso2022_jp_2"), "ISO-2022-JP-2" },
{ YYCC_U8("iso2022_kr"), "ISO-2022-KR" },
{ YYCC_U8("latin_1"), "ISO-8859-1" },
{ YYCC_U8("iso8859_2"), "ISO-8859-2" },
{ YYCC_U8("iso8859_3"), "ISO-8859-3" },
{ YYCC_U8("iso8859_4"), "ISO-8859-4" },
{ YYCC_U8("iso8859_5"), "ISO-8859-5" },
{ YYCC_U8("iso8859_6"), "ISO-8859-6" },
{ YYCC_U8("iso8859_7"), "ISO-8859-7" },
{ YYCC_U8("iso8859_8"), "ISO-8859-8" },
{ YYCC_U8("iso8859_9"), "ISO-8859-9" },
{ YYCC_U8("iso8859_10"), "ISO-8859-10" },
{ YYCC_U8("iso8859_11"), "ISO-8859-11" },
{ YYCC_U8("iso8859_13"), "ISO-8859-13" },
{ YYCC_U8("iso8859_14"), "ISO-8859-14" },
{ YYCC_U8("iso8859_15"), "ISO-8859-15" },
{ YYCC_U8("iso8859_16"), "ISO-8859-16" },
{ YYCC_U8("johab"), "JOHAB" },
{ YYCC_U8("koi8_t"), "KOI8-T" },
{ YYCC_U8("mac_cyrillic"), "MacCyrillic" },
{ YYCC_U8("mac_greek"), "MacGreek" },
{ YYCC_U8("mac_iceland"), "MacIceland" },
{ YYCC_U8("mac_roman"), "MacRoman" },
{ YYCC_U8("mac_turkish"), "MacTurkish" },
{ YYCC_U8("ptcp154"), "PT154" },
{ YYCC_U8("shift_jis"), "SHIFT_JIS" },
{ YYCC_U8("utf_32"), "UTF-32" },
{ YYCC_U8("utf_32_be"), "UTF-32BE" },
{ YYCC_U8("utf_32_le"), "UTF-32LE" },
{ YYCC_U8("utf_16"), "UTF16" },
{ YYCC_U8("utf_16_be"), "UTF-16BE" },
{ YYCC_U8("utf_16_le"), "UTF-16LE" },
{ YYCC_U8("utf_7"), "UTF-7" },
{ YYCC_U8("utf_8"), "UTF-8" },
};
#endif
#pragma endregion
#pragma region Misc
ConvError::ConvError(const ConvError::Error& err) : inner(err) {}
bool is_valid_encoding_name(const EncodingName& name) {
}
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
#pragma region
#pragma endregion
} // namespace yycc::encoding::pycodec

View File

@ -0,0 +1,202 @@
#pragma once
#include "../macro/os_detector.hpp"
#include "../macro/class_copy_move.hpp"
#include "../patch/expected.hpp"
#include "../string.hpp"
// Choose the backend of PyCodec module
#if defined(YYCC_OS_WINDOWS)
#include "windows.hpp"
#define YYCC_PYCODEC_WIN32_BACKEND
#define NS_YYCC_ENCODING_BACKEND ::yycc::encoding::windows
#else
#include "iconv.hpp"
#define YYCC_PYCODEC_ICONV_BACKEND
#define NS_YYCC_ENCODING_BACKEND ::yycc::encoding::iconv
#endif
#define NS_YYCC_STRING ::yycc::string
#define NS_YYCC_PATCH_EXPECTED ::yycc::patch::expected
namespace yycc::encoding::pycodec {
using EncodingName = NS_YYCC_STRING::u8string_view;
/// @private
struct ConvError {
using Error = NS_YYCC_ENCODING_BACKEND::ConvError;
ConvError(const Error& err);
Error inner;
};
/// @private
template<typename T>
using ConvResult = NS_YYCC_PATCH_EXPECTED::Expected<T, ConvError>;
/**
* @brief Check whether given name is a valid encoding name in PyCodec.
* @param[in] name The name to be checked.
* @return True if it is valid, otherwise false.
*/
bool is_valid_encoding_name(const EncodingName& name);
// Char -> UTF8
class CharToUtf8 {
public:
CharToUtf8(const EncodingName& 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:
#if defined(YYCC_PYCODEC_WIN32_BACKEND)
NS_YYCC_ENCODING_BACKEND::CodePage code_page;
#else
NS_YYCC_ENCODING_BACKEND::CharToUtf8 inner;
#endif
};
// UTF8 -> Char
class Utf8ToChar {
public:
Utf8ToChar(const EncodingName& 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:
#if defined(YYCC_PYCODEC_WIN32_BACKEND)
NS_YYCC_ENCODING_BACKEND::CodePage code_page;
#else
NS_YYCC_ENCODING_BACKEND::Utf8ToChar inner;
#endif
};
// WChar -> UTF8
class WcharToUtf8 {
public:
WcharToUtf8();
~WcharToUtf8();
YYCC_DELETE_COPY(WcharToUtf8)
YYCC_DEFAULT_MOVE(WcharToUtf8)
public:
ConvResult<NS_YYCC_STRING::u8string> priv_to_utf8(const std::wstring_view& src);
bool to_utf8(const std::wstring_view& src, NS_YYCC_STRING::u8string& dst);
NS_YYCC_STRING::u8string to_utf8(const std::wstring_view& src);
private:
#if defined(YYCC_PYCODEC_ICONV_BACKEND)
NS_YYCC_ENCODING_BACKEND::WcharToUtf8 inner;
#endif
};
// UTF8 -> WChar
class Utf8ToWchar {
public:
Utf8ToWchar();
~Utf8ToWchar();
YYCC_DELETE_COPY(Utf8ToWchar)
YYCC_DEFAULT_MOVE(Utf8ToWchar)
public:
ConvResult<std::wstring> priv_to_wchar(const NS_YYCC_STRING::u8string_view& src);
bool to_wchar(const NS_YYCC_STRING::u8string_view& src, std::wstring& dst);
std::wstring to_wchar(const NS_YYCC_STRING::u8string_view& src);
private:
#if defined(YYCC_PYCODEC_ICONV_BACKEND)
NS_YYCC_ENCODING_BACKEND::Utf8ToWchar inner;
#endif
};
// 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:
#if defined(YYCC_PYCODEC_ICONV_BACKEND)
NS_YYCC_ENCODING_BACKEND::Utf8ToUtf16 inner;
#endif
};
// 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:
#if defined(YYCC_PYCODEC_ICONV_BACKEND)
NS_YYCC_ENCODING_BACKEND::Utf16ToUtf8 inner;
#endif
};
// 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:
#if defined(YYCC_PYCODEC_ICONV_BACKEND)
NS_YYCC_ENCODING_BACKEND::Utf8ToUtf32 inner;
#endif
};
// 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:
#if defined(YYCC_PYCODEC_ICONV_BACKEND)
NS_YYCC_ENCODING_BACKEND::Utf32ToUtf8 inner;
#endif
};
}
#undef NS_YYCC_PATCH_EXPECTED
#undef NS_YYCC_STRING

View File

@ -1,10 +1,10 @@
#include "utf.hpp"
#include "stlcvt.hpp"
#include <locale>
#define NS_YYCC_STRING ::yycc::string
#define NS_YYCC_PATCH_EXPECTED ::yycc::patch::expected
namespace yycc::encoding::utf {
namespace yycc::encoding::stlcvt {
#pragma region Generic Converter

View File

@ -5,7 +5,7 @@
#define NS_YYCC_STRING ::yycc::string
#define NS_YYCC_PATCH_EXPECTED ::yycc::patch::expected
namespace yycc::encoding::utf {
namespace yycc::encoding::stlcvt {
/// @private
struct ConvError {};

View File

@ -228,6 +228,9 @@ namespace yycc::encoding::windows {
// 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.
// Reference:
// * https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/c16rtomb-c32rtomb1?view=msvc-170
// * https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/mbrtoc16-mbrtoc323?view=msvc-170
// 1 UTF32 unit can produe 4 UTF8 units or 2 UTF16 units in theory.
// So we pre-allocate memory for the result to prevent allocating memory multiple times.
@ -280,8 +283,9 @@ namespace yycc::encoding::windows {
std::mbstate_t state{};
char mbout[MB_LEN_MAX]{};
for (char16_t c : src) {
std::size_t rc = std::c16rtomb(mbout, c, &state);
if (rc != (std::size_t) -1) dst.append(reinterpret_cast<NS_YYCC_STRING::u8char*>(mbout), rc);
size_t rc = std::c16rtomb(mbout, c, &state);
if (rc != (size_t) -1) dst.append(reinterpret_cast<NS_YYCC_STRING::u8char*>(mbout), rc);
else return ConvError::InvalidUtf16;
}
return dst;
@ -340,8 +344,9 @@ namespace yycc::encoding::windows {
std::mbstate_t state{};
char mbout[MB_LEN_MAX]{};
for (char32_t c : src) {
std::size_t rc = std::c32rtomb(mbout, c, &state);
if (rc != (std::size_t) -1) dst.append(reinterpret_cast<NS_YYCC_STRING::u8char*>(mbout), rc);
size_t rc = std::c32rtomb(mbout, c, &state);
if (rc != (size_t) -1) dst.append(reinterpret_cast<NS_YYCC_STRING::u8char*>(mbout), rc);
else return ConvError::InvalidUtf32;
}
return dst;