在C/C++中,使用单引号’ ‘用于表示单个字符,比如’A’。但是中文字符由多个字节组成,不能用单引号正确表示,这会导致编译器将其解析为未定义的多字符常量。
要解决这个问题,确保使用宽字符或者字符串来表示非ASCII 字符。
下面给一个例子:将一个字符串中的阿拉伯数字转成中文小写数字
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
std::string arabicToChinese(const std::string& inputText) {
static std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
// 将输入的std::string转换为std::wstring以处理中文
std::wstring winputText = converter.from_bytes(inputText);
std::wstring woutputText = winputText;
// 定义阿拉伯数字到中文数字的映射,注意类型是wchar_t
std::map<wchar_t, wchar_t> arabicToChineseMap = {
{'0', L'零'}, {'1', L'一'}, {'2', L'二'}, {'3', L'三'}, {'4', L'四'},
{'5', L'五'}, {'6', L'六'}, {'7', L'七'}, {'8', L'八'}, {'9', L'九'}
};
// 执行转换
for(size_t i = 0; i < woutputText.size(); ++i) {
auto it = arabicToChineseMap.find(woutputText[i]);
if(it != arabicToChineseMap.end()) {
woutputText[i] = it->second;
}
}
// 转换回std::string进行输出
return converter.to_bytes(woutputText);
}
int main() {
std::string a = "12345你好世界";
std::string converted = arabicToChinese(a);
std::cout << converted << std::endl; // 应输出类似于“一二三四五一你好世界”
return 0;
}
通过静态声明std::wstring_convert实例,我们复用了相同的转换器,这样可以提高效率。程序首先将输入的std::string通过from_bytes转换为宽字符串进行处理,然后将处理后的宽字符串再通过to_bytes转换回多字节字符串。
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,原本被设计为 7 位的二进制数来表示 128 种可能的字符。这包括了:
- 控制字符(Control Characters): 如 LF(换行)、CR(回车)、BEL(响铃)等,这些字符主要用于文本格式化和设备控制,一般不直接显示为可见字符。
- 数字 (0-9): 0, 1, …, 9.
- 大写字母 (A-Z): A, B, …, Z.
- 小写字母 (a-z): a, b, …, z.
- 标点符号和特殊符号:
- 标点符号:, . , ;, :, ?, !, ', ", -, (, ), [, ], {, }, <, >, /, , |, _, +, =, *, %, &, ^, ~, #, $, @,
- 算术符号:+, -, *, /
- 特殊符号:, ~, , !, @, #, $, %, ^, &, *, (, ), -, =, [, ], {, }, ;, :, ', ", , ., <, >
- 其他:\(反斜杠)、:(冒号)、;(分号)、"(双引号)、'(单引号)、\n(换行)、\r(回车)等。
- 不可打印字符: 包括空格(ASCII 码为 32,可视为空白字符),以及一些控制字符(如水平制表符(ASCII 码 9, \t)、垂直制表符、换页符等),它们在屏幕上一般不显示具体的形状。
- 删除字符 (DEL): ASCII 码 127,用于指示数据删除或作为错误标记。
3407

被折叠的 条评论
为什么被折叠?



