当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集(ANSI还是UNICODE)的哪种编码(ANSI每个国家都可能不同,UNICODE分为UTF-8,UTF-16,UTF-32)保存的。
1.表示字符: P16
字符集演变:ASCII码(7bit表示)–ASCII(8bit表示,变体称为Latin-1)–其他各国专用字符集–通用字符集(UCS,32bit表示)
2.使用字符变量 P50
wchar_t wch(L'h');
也可使用十六进制表示法创建
wchar_t wch1(L'\x0438'); //Cyrillic(西里尔语) N
3.国际字符串
wstring包含wchar_t类型的字符串,wchar_t是c++内置的宽字符类型
u16string对象,该对象包含16位Unicode字符串,其类型是char16_t
u32string对象,该对象包含32位Unicode字符串,其类型是char32_t
stiing头文件定义了所有这些类型,后两个类型比存储wchar_t字符的字符串类型更有用。
注:
理论上,可以使用string把字符串存储为UTF-8字符。定义UTF-8字符串时在普通字符串字面量的前面加上u8,但是string类型把字符存储为char类型,且对unicode编码一无所知。UTF-8编码使用1-4字节编码每个字符,操作字符串的对象的函数无法识别它。例如,如果字符串包含需要两个或三个字节表示的字符,length()就会返回错误的长度
初始化字符串时时应加上对应的前缀(L,u,U),所有字符串类型可使用的函数同string。
wstring类型的问题是给wchar_t类型应用的字符编码是由实现方式定义(各个国家的多字节编码不同)的,所以随编译器的不同而不同,如果需要使用支持多个国家的字符集,最好使用u16string和u32string。
原字符串字面量:所有字面都都不需要在使用转义符\来进行转义,这种用法对于正则表达式来说可读性很高。
通过加上前缀 R”( 与后缀)”
(书上说可通过加前缀 “*( 与后缀 )*”,可通过RU使char32_t指定为原字符串字面量,我反正这样使用编译器报错)
string str = R"(FSD""\\FSD)"; cout << str << endl;
4.windows下的字符转换
void CharChange(std::string &strInfo) {
int nwLen = MultiByteToWideChar(CP_UTF8, 0, strInfo.c_str(), -1, NULL, 0); wchar_t * pwBuf = new wchar_t[nwLen + 1]; memset(pwBuf, 0, (nwLen + 1) * sizeof(wchar_t)); MultiByteToWideChar(CP_UTF8, 0, strInfo.c_str(), strInfo.length(), pwBuf, nwLen); int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL); char * pBuf = new char[nLen + 1]; memset(pBuf, 0, nLen + 1); // 多字节的编码 WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL); strInfo = pBuf; delete[]pBuf; delete[]pwBuf; pBuf = NULL; pwBuf = NULL; }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221908.html原文链接:https://javaforall.net
