是
0x00 0x00
)等价于
UTF-16BE
也就等价于
UCS-2BE
BOM
为了说明一个文件采用的是什么编码,在文件最开始的部分,可以有
BOM
,比如
0xFE 0xFF
表示
UTF-16BE
,
0xFF 0xFE 0x00 0x00
表示
UTF-32LE
。
UTF-8
原本是不需要
BOM
的,因为其
自我同步的特性,但是为了明确说明这是
UTF-8
(而不是让文本编辑器去猜),也可以加
上
UTF-8
的
BOM
:
0xEF 0xBB 0xBF
。
以上内容都讲述得很概略,详细信息请查阅维基百科相关内容。
3
、利用
C
运行时库函数转换
std::locale
通过前面两节的知识,我们知道了在
C/C++
中,字符(串)和宽字符(串)之间的转换不
是简单的,固定的数学关系,宽窄转换依赖于本地化策略集(
locale
)。换句话说,一个程
序在运行之前并不知道系统的本地化策略集是什么,程序只有在运行之后才通过
locale
获
得当时的本地化策略集。
C
有自己的
locale
函数,我们这里直接介绍
C++
的
locale
类。
先讨论
locale
的构造函数:
locale() throw();
这个构造函数是获得当前程序的
locale
,用法如下:
std::locale app_loc = std::locale();
或者
std::locale app_loc;
(这是构造对象的两种表示方式,后同)
另外一个构造函数是:
explicit locale(const char* name);
这个构造函数以
name
的名字创建新的
locale
。重要的
locale
对象有:
std::locale sys_loc("");
//
获得当前系统环境的
locale
std::locale C_loc("C");
或者
std::locale C_loc = std::locale::classic();
//
获得
C
定义
locale
std::locale old_loc = std::locale::global(new_loc);
//
将
new_loc
设置为当前全局
locale
,并将原来的
locale
返回给
old_loc
除了这些,其它的
name
具体名字依赖于
C++
编译器和操作系统,比如
Linux
下
gcc
中文系
统的
locale
名字为
"zh_CN.UTF-8"
,中文
Windows
可以用
"chs"
(更加完整的名字可以用
name()
函数查看)。
mbstowcs()
和
wcstombs()
这两个
C
运行时库函数依赖于全局
locale
进行转换,所以,使用前必须先设置全局
locale
。
std::locale
已经包含在
<iostream>
中了,再加上我们需要用到的
C++
字符串,所以包含
<string>
。