字节和字符的区别
- 字节(octet)是一个八位的存储单元,取值范围一定是0~255。而字符(character,或者word)为语言意义上的符号,范围就不一定了。例如在UCS-2中定义的字符范围为0~65535,它的一个字符占用两个字节。
Big Endian和Little Endian
字符0xabcd如果存储为 AB CD,则称为Big Endian;如果存储为 CD AB,则称为Little Endian。文章来源地址https://www.toymoban.com/news/detail-683475.html
字符集和编码关系
- 一个字符集,它规定了每个字符对应的唯一字符码,却没有规定这个字符码在计算机中怎样存储。例如,汉字“一”,它的 Unicode 字符码为\u4e00,转换成二进制就是 100 1110 0000 0000 。可以看到,它有 15 位二进制数,至少需要两个字节来存储。
- 于是UTF-32 编码 制定了标准,一个字符就用四个字节来表示。这样编码和解码都方便,固定取 32 位二进制就行了。
编码标准和字符集
- 首先要注意:宽窄字符与UTF16,UTF8不是对应的关系
- 多字节:有的编码方式采用 1~n 个字节存储,是变长的,例如UTF-8、GB2312、GBK 等;如果一个字符使用了这种编码方式,就将它称为多字节字符,或者窄字符。
- 宽字节:有的编码方式是固定长度的,不管字符编号大小,始终采用 n 个字节存储,例如 UTF-32、UTF-16等;如果一个字符使用了这种编码方式,就将它称为宽字符。
Unicode字符集
- Unicoide 的全称是 Universal Multiple-Octet Coded Character Set(通用多八位字符集,简称 UCS)。
- Unicode是为整合全世界的所有语言文字而诞生的。任何文字在Unicode中都对应一个值,这个值称为代码点(code point)。代码点的值通常写成 U+ABCD 的格式。而文字和代码点之间的对应关系就是UCS-2(Universal Character Set coded in 2 octets)。顾名思义,UCS-2是用两个字节来表示代码点,其取值范围为 U+0000~U+FFFF。为了能表示更多的文字,人们又提出了UCS-4,即用四个字节表示代码点。它的范围为 U+00000000~U+7FFFFFFF,其中 U+00000000~U+0000FFFF和UCS-2是一样的。要注意,UCS-2和UCS-4只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。规定存储方式的称为UTF(Unicode Transformation Format),其中应用较多的就是UTF-16和UTF-8了。
- UTF-8、UTF-16、UTF-32都是字符编码,不是字符集。
ANSI标准
- ANSI并不是某一种特定的字符编码,而是在不同的系统中,ANSI表示不同的编码。电脑卖给美国国内的系统默认就用ASCII编码,卖给中国人的系统默认就用GBK编码,卖给韩国人的系统默认就用EUC-KR编码,…但是为了避免误会系统功能有差异,就统一把默认编码都显示成ANSI。
编码
GB码
- GBK、GB2321既是字符集,又是字符编码。GBK是GB2312的超集。
GB2312
- GB2312对任意一个图形字符都采用两个字节表示,并对所收汉字进行了“分区”处理,每区含有 94
个汉字/符号,分别对应第一字节和第二字节。
GBK
- GBK的中文编码是双字节来表示的,英文编码是用ASCII码表示的,即用单字节表示。但GBK编码表中也有英文字符的双字节表示形式,所以英文字母可以有2种GBK表示方式。为区分中文,将其最高位都定成1。英文单字节最高位都为0。当用GBK解码时,若高字节最高位为0,则用ASCII码表解码;若高字节最高位为1,则用GBK编码表解码。
UTF码
UTF-8
- UTF-8将0x0080以下字符编为1字节,0x0080-07FF字符编为2字节,0x0800以上字符编为3字节,代理对(surrogate pair)编为4字节。
- ASCII字符是单个字节的,比如“A”的ASCII是65。而Unicode是双字节的,比如“A”的Unicode是0065,C语言使用‘\0’作为字符串结尾,这样一来,C语言的字符串函数将无法正常处理Unicode。在UTF-8里,英文字符仍然跟ASCII编码一样,因此原先的函数库可以继续使用。
UTF-16
- UTF-16是完全对应于UCS-2的, 它将每个字符编码为两个字节,但2字节不足以表示某些语言的所有字符,于是UTF-16支持使用代理,可以使用4字节表示一个字符。UTF-16包括三种:UTF-16,UTF-16BE(Big Endian),UTF-16LE(Little Endian)。
UTF-32
- UTF-32是完全对应于UCS-4的,它将所有字符都编码为4字节。
Unicode编程
ANSI字符 转 Unicode字符
//VS2019中的字符集选择Unicode字符集
//Windoes下ANIS转Unicode ASIN一般是GB2312,GB18030,GBK等编码,Unicode一般是ucs-2或UTF-16
wchar_t* CharToWchar(const char* str) {
if (str == 0)
return 0;
wchar_t* m_wchar;
int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
m_wchar = new wchar_t[len + 1];
MultiByteToWideChar(CP_ACP, 0, str, -1, m_wchar, len);
m_wchar[len] = '\0';
return m_wchar;
}
int main(int argc, char* argv[]) {
ifstream in("1.txt");//1.txt内容是: 中国,编码是gb2312
string line;
if (in.is_open()) {
getline(in, line);
wstring wline = CharToWchar(line.c_str());
wcout.imbue(locale("zh_CN"));
wcout << wline << endl;
/*wchar_t* wline = CharToWchar(line.c_str());
setlocale(LC_CTYPE, "");
wprintf(L"%s\n", wline);
setlocale(LC_CTYPE, "C");*/ //C语言
}
system("pause");
return 0;
}
文章来源:https://www.toymoban.com/news/detail-683475.html
到了这里,关于C++国际化编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!