C++中的字符编码⽅式
⽬录
C++基本数据类型中表⽰字符的有两种:char、wchar_t。
1.char
本质上,内存中存的就是⼀个char是⼀个8个bit,0101的值,⾄于怎么解析这个0101,其值代表什么字符,怎么显⽰给你看的,就是有⼀个对应的字符编码表了。
⼀个char占⼀个字节(8bit)。如果你要定义中⽂字符,其空间要预留够⼤,因为:
中⽂字符,占⽤的是2个字节,即2个char。
英⽂字符,占⽤的是1个字节,即1个char。
下⾯定义的“str” 为4个字节的char数组。
等号右边“中”是字符常量,const char [3],本⾝“中”字占⽤2个字节,加上字符常量末尾⾃动添加的0。
所以如果等号左边 str 定义的是 < 3 的数组长度就会提⽰编译不通过了。
为什么中⽂字符占⽤两个字节,因为C++中中⽂字符⽤的是的编码⽅式。
那么这个CPP⽂件是⼀个⽂本⽂件,选择不同的编码⽅式,其⽂本的⼆进制码就是不同的。⼀般的CPP都是选⽤utf编码格式的。⽂本本⾝的编码格式,和C++对这个字符的编码格式,不是同⼀个概念。
⽐如上述的存的是 -42 和 -48 的原因就是 “中”的GBK编码的码值为 D6D0。
D6,也就是⽤有符号的⼀个字节表⽰的 -42。
D0,也就是⽤有符号的⼀个字节表⽰的 -48。
char 是 有符号的char
2.wchar_t
⼀个wchar_t占2个字节。16个bit位。
⼀个字符 占⽤⼀个 wchar_t,不管是中⽂字符还是英⽂字符。
下⾯定义的“str” 为2个字节的wchar_t数组。
等号右边L“中”是宽字符常量,const wchar_t[2],本⾝“中”字占⽤⼀个wchar_t(2个字节),加上字符常量末尾⾃动添加的0。
所以如果等号左边 str 定义的是 < 2 的数组长度就会提⽰编译不通过了。
为什么是20013。因为宽字符⽤的是unicode,⽽且是,中中”的unicode码点是4E2D,⽽对于⼀般的字符utf16正好就是直接是码点的值,因为都是16位的。
wchar_t 是 unsigned short(16bit的),那么就是4E2D就是20013。
3.TCHAR这个宏的类型
我们说过在 中说过字符集 和 字符编码⽅式的概念。那么在C++中我们也可以选择使⽤什么字符集,是unicode字符集,还是其他字符集:
当配置选择 使⽤多字节字符集的时候 TCHAR 为 char。(为什么这叫多字节,应该就是⼀个字符需要⽤多个TCHAR来编码的意思吧。)。char对中⽂字符的编码是GBK。
当配置选择 使⽤Unicode字符集的时候 TCHAR 为 wchar_t。wchar_t对中⽂字符的编码是Unicode。
具体实现通过是否定义了_UNICODE宏,对TCHAR进⾏设置为不同的类型。
所以,上⾯的配置只是针对于TCHAR这个宏⽤的char还是wchar_t。
即使当你配置中选择了使⽤Unicode字符集的时候,你还是可以在代码中使⽤char类型来表⽰中⽂,其值还是使⽤GBK的编码⽅式。
当你配置中选择了使⽤多字节字符集的时候,你也还是可以在代码中⽤wchar_t类型来表⽰中⽂时,其值是使⽤utf16的编码⽅式。
char 和 wchar_t 对字符的编码的⽅式,不会随着配置中选择了什么字符集⽽改变,该是什么还是什么。
4.std::wstring和 std::string
std::wstring
是⼀个泛型的类,其中的类型是wchar_t
typedef basic_string<wchar_t> wstring;
This is an instantiation of the class template that uses wchar_t as the character type, with its default and types
wstring.length
其实就是 std::::length
Returns the length of the string, in terms of number of characters. 所以这⾥的字符是wchar的个数(如果是string 就是char的个数。) This is the number of actual characters that conform the contents of the , which is not necessarily equal to its storage . Both and basic_string::length are synonyms and return the same value.
4.⼀些函数
1.char 转化为字符串
⽐如 char* 是utf8编码的字符,那输出char*显⽰肯定是乱码,因为char是⽤GBK编码的。
通过下⾯的函数输出原始的utf8编码的16进制值。
1#include <iostream>
2#include <stdlib.h>
3#include <string.h>
4using namespace std;
5
6char buffer[9]; //⽤于存放转换好的⼗六进制字符串,可根据需要定义长度
7char * inttohex(int aa)
8{
9 _itoa_s(aa, buffer, 16);
10 if (aa < 0)
11 {
12 // 取 buff 的最后三位
13 return &buffer[6];
14 }
15 else
16 {
17 // 取 buff 的前三位
18 return buffer;
19 }
20 return (buffer);
21}
22void main(void)
23{
24 // 这⾥没有模拟utf8编码的字符,只是举例转为16进制的过程
25 char str[15] = "假如是⼀堆乱码";
26
27 char hex_final[100] = "";
28 // 最后⼀个str[14] = 0 就不翻译为hex了
29 for (int i = 0; i < 14; ++i)
30 {
31 char* hex_tmp = inttohex(str[i]);
32 strcat_s(hex_final, hex_tmp);
中文字符unicode查询33 }
34 cout << hex_final << endl;
35}
2.字符串的UTF-8与GBK(或GB2312)编码转换
UE⾥⾯⾃带的字符转换函数
// Conversion typedefs
typedef TStringConversion<TCHAR,ANSICHAR,FANSIToTCHAR_Convert> FANSIToTCHAR; typedef TStringConversion<ANSICHAR,TCHAR,FTCHARToANSI_Convert> FTCHARToANSI; typedef TStringConversion<ANSICHAR,TCHAR,FTCHARToOEM_Convert> FTCHARToOEM; typedef TStringConversion<ANSICHAR,TCHAR,FTCHARToUTF8_Convert> FTCHARToUTF8; typedef TStringConversion<TCHAR,ANSICHAR,FUTF8ToTCHAR_Convert> FUTF8ToTCHAR;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论