ASCII码生成和字符编号获取
有一段时间用ASCII码特别勤,但是我又死活记不住哪些,就写了一个小工具,不过写了之后反而没有用过了。淦~
简单记录一下吧

// ascii_code.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // 本程序生成ASCII序号和对应字符。以后可能会拓展 // #include <iostream> #include <iomanip> #include <string> #include <map> #include "..\my_func\my_function.h" #include<Windows.h> std::map<int, wchar_t>html_code{ {161,L'?'},{162,L'¢'},{163,L'£'},{164,L'¤'},{165,L'¥'},{166,L'|'},{167,L'§'},{168,L'¨'},{169,L'©'},{170,L'a'},{171,L'?'},{172,L'?'},{173,L''},{174,L'®'},{175,L'ˉ'},{176,L'°'},{177,L'±'},{178,L'2'},{179,L'3'},{180,L'′'},{181,L'μ'},{182,L'?'},{183,L'·'},{184,L'?'},{185,L'1'},{186,L'o'},{187,L'?'},{188,L'?'},{189,L'?'},{190,L'?'},{191,L'?'},{192,L'À'},{193,L'Á'},{194,L'Â'},{195,L'Ã'},{196,L'Ä'},{197,L'Å'},{198,L'Æ'},{199,L'Ç'},{200,L'È'},{201,L'É'},{202,L'Ê'},{203,L'Ë'},{204,L'Ì'},{205,L'Í'},{206,L'Î'},{207,L'Ï'},{208,L'Ð'},{209,L'Ñ'},{210,L'Ò'},{211,L'Ó'},{212,L'Ô'},{213,L'Õ'},{214,L'Ö'},{215,L'×'},{216,L'Ø'},{217,L'Ù'},{218,L'Ú'},{219,L'Û'},{220,L'Ü'},{221,L'Ý'},{222,L'Þ'},{223,L'ß'},{224,L'à'},{225,L'á'},{226,L'â'},{227,L'ã'},{228,L'ä'},{229,L'å'},{230,L'æ'},{231,L'ç'},{232,L'è'},{233,L'é'},{234,L'ê'},{235,L'ë'},{236,L'ì'},{237,L'í'},{238,L'î'},{239,L'ï'},{240,L'ð'},{241,L'ñ'},{242,L'ò'},{243,L'ó'},{244,L'ô'},{245,L'õ'},{246,L'ö'},{247,L'÷'},{248,L'ø'},{249,L'ù'},{250,L'ú'},{251,L'û'},{252,L'ü'},{253,L'ý'},{254,L'þ'},{255,L'ÿ'} }; const static size_t LEN{ 128 }; //字符范围 /* * 解析-char参数;此函数只解析参数格式,但是不校验参数是否合乎预期 * source_data:源数据数组指针 * len:source_data的长度 * flag:若是为true,则解析source_data数组。若是为false,则通过命令行提示用户输入 */ void analyze_char_parameter(char** source_data, unsigned len, bool flag); /* * 解析-code参数;此函数只解析参数格式,但是不校验参数是否合乎预期 * source_data:源数据数组指针 * len:source_data的长度 * flag:若是为true,则解析source_data数组。若是为false,则通过命令行提示用户输入 */ void analyze_code_parameter(char** source_data, unsigned len, bool flag); /* * 本函数用于输出显示使用 * code:序号 * ch:字符 * order:输出顺序,默认为true(表示序号在前,字符在后),为false时则相反 * with:序号宽度,默认为8 * spacer:间隔符,默认为\t * ending_symbol:结尾符号,默认为\n */ void wirte_screen(std::wstring code, wchar_t ch, bool order = true, unsigned with = 8, wchar_t spacer = L'\t', wchar_t ending_symbol = L'\n'); /* * 检查值是否符合预期并调用对应函数输出 * start_index:起始编号(包含) * end_index:结尾编号(不包含) * flag:0表示使用常规数字映射字符。1表示使用html映射字符,2表示8进制数,3表示16进制数 */ bool code_to_char_check(std::string start_index, std::string end_index); /* * start_index:起始编号(包含) * end_index:结尾编号(不包含) */ void code_to_char(size_t start_index, size_t end_index); /* * str:待转换为code的字符串 * 将字符转换为code输出 */ /*输出帮助信息*/ void help(); void char_to_code(std::wstring str); /* * 有四种模式: * 默认不传递参数的模式:输出1-128的ASCII码 * 指定参数-code的模式,输出指定code值对应的字符: 示例: -code 68 79 :输出68和79对应的字符 -code 68,79 :输出68和79对应的字符 -code 68 :表示输出68对应的字符 -code 68-79 :表示输出68到79之间的字符 -code 66,68-70 :表示输出66、68到70之间的字符(66,68,69,70) -code -128 :表示输出0-128之间的字符 -code ,55 :表示输出55对应的字符 -code ¡ :表示输出¡对应的字符? -code \0x22; :表示输出十六进制数22对应的字符 说明: 支持识别html特殊字符的十进制表现形式的转换: 字符 十进制 ? ¡ ¢ ¢ £ £ ¤ ¤ ¥ ¥ | ¦ § § ¨ ¨ © © a ª ? « ? ¬ /x7f ­ ® ® ˉ ¯ ° ° ± ± 2 ² 3 ³ ′ ´ μ µ ? ¶ · · ? ¸ 1 ¹ o º ? » ? ¼ ? ½ ? ¾ ? ¿ À À Á Á Â Â Ã Ã Ä Ä Å Å Æ Æ Ç Ç È È É É Ê Ê Ë Ë Ì Ì Í Í Î Î Ï Ï Ð Ð Ñ Ñ Ò Ò Ó Ó Ô Ô Õ Õ Ö Ö × × Ø Ø Ù Ù Ú Ú Û Û Ü Ü Ý Ý Þ Þ ß ß à à á á â â ã ã ä ä å å æ æ ç ç è è é é ê ê ë ë ì ì í í î î ï ï ð ð ñ ñ ò ò ó ó ô ô õ õ ö ö ÷ ÷ ø ø ù ù ú ú û û ü ü ý ý þ þ ÿ ÿ 参数值中的不符合预期的字符被视为终止符号,将忽视该字符以及该字符后面的字符。 使用连字符指定范围时,若是后面的数字小于前面的数字,将不会判定为错误,而是视为倒序输出;若是前后两个数字相等,则表示连续输出两个同样的字符 * 指定参数-char的模式,输出指定字符串值对应的code: 示例: -char abcdefg :表示依次输出abcdefg每个字符对应的code值 -char a d :表示输出a、空格、d字符对应的code值 * 指定参数-h的模式,输出帮助信息 * * 注:因为编码的缘故,若是你想要看到完整的Unicode字符的真实编码,需要将Windows电脑的默认字符集设置为Unicode,但是这个开启后会导致部分软件显示不正常。但是部分的中文字符是支持的 */ int main(int argc, char* argv[]) { std::ios::sync_with_stdio(false);// 禁用同步 std::locale::global(std::locale("")); //本地化 /*for (int i{ 0 }; i < argc; ++i) { std::cout << argv[i] << '\n'; } std::cout << "完毕\n";*/ if (argc == 1) { //不传递参数模式 code_to_char(1, 128); } else { //检查是否是需要帮助信息 if (std::string("-h")._Equal(argv[1])) { help(); exit(0); } else if (std::string("-char")._Equal(argv[1])) { if (argc == 2) { analyze_char_parameter(argv, argc, false); } else { analyze_char_parameter(argv, argc, true); } } else if (std::string("-code")._Equal(argv[1])) { if (argc == 2) { analyze_code_parameter(argv, argc, false); } else { analyze_code_parameter(argv, argc, true); } } else { help(); exit(0); } } system("pause"); } void help() { std::wcout << LR"(/* * 有四种模式: * 默认不传递参数的模式:输出1-128的ASCII码 * 指定参数-code的模式,输出指定code值对应的字符: 示例: -code 68 79 :输出68和79对应的字符 -code 68 :表示输出68对应的字符 -code 68-79 :表示输出68到79之间的字符 -code 66,68-70 :表示输出66、68到70之间的字符(66,68,69,70) -code -128 :表示输出0-128之间的字符 -code ,55 :表示输出55对应的字符 -code ¡ :表示输出¡对应的字符? -code \0x22; :表示输出十六进制数22对应的字符 说明: 支持识别html特殊字符的十进制表现形式的转换: 参数值中的不符合预期的字符被视为终止符号,将忽视该字符以及该字符后面的字符。 使用连字符指定范围时,若是后面的数字小于前面的数字,将不会判定为错误,而是视为倒序输出;若是前后两个数字相等,则表示连续输出两个同样的字符 * 指定参数-char的模式,输出指定字符串值对应的code: 示例: -char abcdefg :表示依次输出abcdefg每个字符对应的code值 -char a d :表示输出a、空格、d字符对应的code值 * 指定参数-h的模式,输出帮助信息 * * 注:因为编码的缘故,若是你想要看到完整的Unicode字符的真实编码,需要将Windows电脑的默认字符集设置为Unicode,但是这个开启后会导致部分软件显示不正常。但是部分的中文字符是支持的 */)" << L'\n'; } void char_to_code(std::wstring str) { for (auto ch : str) { wirte_screen(std::to_wstring(static_cast<size_t>(ch)), ch, false); } } void code_to_char(size_t start_index, size_t end_index) { if (start_index <= end_index) { for (; start_index <= end_index; ++start_index) { wirte_screen(std::to_wstring(start_index), static_cast<wchar_t>(start_index)); } } else { for (; start_index >= end_index; --start_index) { wirte_screen(std::to_wstring(start_index), static_cast<wchar_t>(start_index)); } } } /* * html版本的code转char,从start_index开始依次递增count个;若是超长,则止步于实际长度的字符数 */ void htmlCode_to_char(int start_index, int count) { //范围是161-255 int range = start_index + count; if (range > 255) { range = 255; } else if (range < 161) { range = 161; } if (count >= 0) { for (; start_index <= range; ++start_index) { wirte_screen(L"&#" + std::to_wstring(start_index) + L";", html_code[start_index]); } } else { //逆序 for (; start_index >= range; --start_index) { wirte_screen(L"&#" + std::to_wstring(start_index) + L";", html_code[start_index]); } } } bool code_to_char_check(std::string start_index, std::string end_index) { long long start_number{}, end_number{}; //删除前面的空白符 start_index = MY_TOOLS::remove_leading_whitespace(start_index); end_index = MY_TOOLS::remove_leading_whitespace(end_index); bool conversion_result{}; //转换结果 if (start_index[0] == '\\') { //8进制或者16进制 if (end_index[0] == '\\') { if (start_index.size() > 2) { if (start_index[1] == '0') { //16进制 start_number = MY_TOOLS::string_to_value(start_index.substr(1, start_index.size() - 1), "", &conversion_result, 16); if (conversion_result) { if (end_index.size() > 2) { if (end_index[1] == '0') { //16进制 end_number = MY_TOOLS::string_to_value(end_index.substr(1, end_index.size() - 1), "", &conversion_result, 16); if (conversion_result) { code_to_char(start_number, end_number); return true; } else { //转换失败 std::wcerr << L"16进制数转换失败,end_index:" << MY_TOOLS::to_wstring(end_index) << L'\n'; return false; } } else if (start_index[1] == 'o') { //8进制 end_number = MY_TOOLS::string_to_value(end_index.substr(2, end_index.size() - 2), "", &conversion_result, 8); if (conversion_result) { code_to_char(start_number, end_number); return true; } else { //转换失败 std::wcerr << L"8进制数转换失败,end_index:" << MY_TOOLS::to_wstring(end_index) << L'\n'; return false; } } else { //错误 std::wcerr << L"未知的进制,end_index:" << MY_TOOLS::to_wstring(end_index) << L'\n'; return false; } } else { //长度不对 std::wcerr << L"长度无法满足,end_index:" << MY_TOOLS::to_wstring(end_index) << L'\n'; return false; } } else { //转换失败 std::wcerr << L"16进制数转换失败,start_index:" << MY_TOOLS::to_wstring(start_index) << L'\n'; return false; } } else if (start_index[1] == 'o') { //8进制 start_number = MY_TOOLS::string_to_value(start_index.substr(2, start_index.size() - 2), "", &conversion_result, 8); if (conversion_result) { if (end_index.size() > 2) { if (end_index[1] == '0') { //16进制 end_number = MY_TOOLS::string_to_value(end_index.substr(1, start_index.size() - 1), "", &conversion_result, 16); if (conversion_result) { code_to_char(start_number, end_number); return true; } else { //转换失败 std::wcerr << L"16进制数转换失败,end_index:" << MY_TOOLS::to_wstring(end_index) << L'\n'; return false; } } else if (start_index[1] == 'o') { //8进制 end_number = MY_TOOLS::string_to_value(end_index.substr(2, end_index.size() - 2), "", &conversion_result, 8); if (conversion_result) { code_to_char(start_number, end_number); return true; } else { //转换失败 std::wcerr << L"8进制数转换失败,end_index:" << MY_TOOLS::to_wstring(end_index) << L'\n'; return false; } } else { //错误 std::wcerr << L"未知的进制,end_index:" << MY_TOOLS::to_wstring(end_index) << L'\n'; return false; } } else { //长度不对 std::wcerr << L"长度无法满足,end_index:" << MY_TOOLS::to_wstring(end_index) << L'\n'; return false; } } else { //转换失败 std::wcerr << L"8进制数转换失败,start_index:" << MY_TOOLS::to_wstring(start_index) << L'\n'; return false; } } else { //错误 std::wcerr << L"未知的进制,start_index:" << MY_TOOLS::to_wstring(start_index) << L'\n'; return false; } } else { //长度不对 std::wcerr << L"长度无法满足,start_index:" << MY_TOOLS::to_wstring(start_index) << L'\n'; return false; } } else { //同一次解析遇到前后不一样的情况,视为错误; std::wcerr << L"同一次解析遇到前后不一样的情况,视为错误:" << MY_TOOLS::to_wstring(start_index) << L"-" << MY_TOOLS::to_wstring(end_index) << L'\n'; return false; } } else if (start_index[0] == '&') { //html if (end_index[0] == '&') { if (start_index.size() != 6) { std::wcerr << L"start_index:html的十进制数字符个数不为6:" << MY_TOOLS::to_wstring(start_index) << L"\n"; return false; } if (end_index.size() != 6) { std::wcerr << L"end_index:html的十进制数字符个数不为6:" << MY_TOOLS::to_wstring(end_index) << L"\n"; return false; } start_number = MY_TOOLS::string_to_value(start_index.substr(2, 3), "", &conversion_result); if (conversion_result) { end_number = MY_TOOLS::string_to_value(end_index.substr(2, 3), "", &conversion_result); if (conversion_result) { htmlCode_to_char(static_cast<int>(start_number), static_cast<int>(end_number - start_number)); return true; } else { //转换失败 std::wcerr << L"html数字转换失败,end_index:" << MY_TOOLS::to_wstring(end_index) << L'\n'; return false; } } else { //转换失败 std::wcerr << L"html数字转换失败,start_index:" << MY_TOOLS::to_wstring(start_index) << L'\n'; return false; } } else { //同一次解析遇到前后不一样的情况,视为错误; std::wcerr << L"同一次解析遇到前后不一样的情况,视为错误:" << MY_TOOLS::to_wstring(start_index) << L"-" << MY_TOOLS::to_wstring(end_index) << L'\n'; return false; } } else if ('0' <= start_index[0] && '9' >= start_index[0]) { //常规数字 if ('0' <= end_index[0] && '9' >= end_index[0]) { start_number = MY_TOOLS::string_to_value(start_index, "", &conversion_result); end_number = MY_TOOLS::string_to_value(end_index, "", &conversion_result); code_to_char(start_number, end_number); } else { //同一次解析遇到前后不一样的情况,视为错误; std::wcerr << L"同一次解析遇到前后不一样的情况,视为错误:" << MY_TOOLS::to_wstring(start_index) << L"-" << MY_TOOLS::to_wstring(end_index) << L'\n'; return false; } } else { //非预期情况 std::wcerr << L"无法识别:" << MY_TOOLS::to_wstring(start_index) << L"\n"; return false; } return false; } void analyze_code_parameter(char** source_data, unsigned len, bool flag) { std::string parameter_values; if (flag) { for (unsigned i{ 2 }; i < len; ++i) { auto split_ret = MY_TOOLS::split(source_data[i], ',', std::strlen(source_data[i])); for (auto& v : split_ret) { auto hyphen_ret = MY_TOOLS::split(v, '-', v.size()); if (hyphen_ret.size() == 1) { //没有范围,单个code code_to_char_check(hyphen_ret.front(), hyphen_ret.front()); } else { //有范围,只取第一个和最后一个 code_to_char_check(hyphen_ret.front(), hyphen_ret.back()); } } } } else { //提示用户输入 std::wcout << L"请输入-code的参数值:"; std::getline(std::cin, parameter_values); MY_TOOLS::replace(parameter_values, 0, parameter_values.size(), " ", ",", true); auto split_ret = MY_TOOLS::split(parameter_values, ',', parameter_values.size()); for (auto& v : split_ret) { auto hyphen_ret = MY_TOOLS::split(v, '-', v.size()); if (hyphen_ret.size() == 1) { //没有范围,单个code code_to_char_check(hyphen_ret.front(), hyphen_ret.front()); } else { //有范围,只取第一个和最后一个 code_to_char_check(hyphen_ret.front(), hyphen_ret.back()); } } } } void analyze_char_parameter(char** source_data, unsigned len, bool flag) { std::string parameter_values; std::wstring data; if (flag) { for (unsigned i{ 2 }; i < len; ++i) { parameter_values += source_data[i]; parameter_values += ' '; } parameter_values = parameter_values.substr(0, parameter_values.size() - 1); //去掉最后一个空格 //扩展成wstring,识别中文 data = MY_TOOLS::string2wstring(parameter_values); } else { std::wcout << L"请输入字符:\n"; std::getline(std::wcin, data); } char_to_code(data); } void wirte_screen(std::wstring code, wchar_t ch, bool order, unsigned with, wchar_t spacer, wchar_t ending_symbol) { if (order) { std::wcout << std::setw(with) << code << spacer << ch << ending_symbol; } else { std::wcout << std::setw(with) << ch << spacer << code << ending_symbol; } if (std::wcout.fail()) { //检查输出流是否因为特殊字符导致无法正常输出 std::wcout.clear(); //清除错误标志 std::wcerr << L"特殊字符无法显示!\n"; } } // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单 // 调试程序: F5 或调试 >“开始调试”菜单 // 入门使用技巧: // 1. 使用解决方案资源管理器窗口添加/管理文件 // 2. 使用团队资源管理器窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4. 使用错误列表窗口查看错误 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
分类:
C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?