在Windows中,有mbstowcs
之类的函数可以在char和wchar_t之间进行转换。还有一些C ++函数,例如from_bytes<std::codecvt<wchar_t, char, std::mbstate_t>>
可以使用。
但是,由于char和wchar_t显然具有不同的大小,这是如何工作的?我假设系统代码页以某种方式涉及?但是如果wchar_t无法与char相关联(它可能包含更多值)会发生什么?
如果必须使用char(可能是由于库)的代码在具有不同代码页的计算机之间移动,会发生什么?假设它只使用完全在ASCII范围内的数字(0-9),那总是安全吗?
最后,在本地语言无法用256个字符表示的计算机上会发生什么?在这种情况下,除了存储例如utf8之外,char的概念似乎完全无关紧要。
答案 0 :(得分:1)
这完全取决于所使用的 cvt 方面,如here所述
在您的情况下,(std::codecvt<wchar_t, char, std::mbstate_t>
)使用全局区域设置归结为mbsrtowcs
/ wcsrtombs
。 (即&#34; C&#34;语言环境,如果你不用系统替换它)
答案 1 :(得分:0)
我不了解mbstowcs()
,但我认为它与std::codecvt<cT, bT, std::mbstate_t>
类似。后者的旅行方式有两种:
cT
中的字符类型 wchar_t
。bT
,通常为char
。游戏中的第三种类型std::mbstate_t
用于存储对std::codecvt<...>
方面的调用之间的任何中间状态。方面不能具有任何可变状态,并且需要以某种方式获得呼叫之间的任何状态。遗憾的是,std::mbstate_t
的结构未指定,即在创建自己的代码转换方面时没有可移植的实际方法。
std::codecvt<...>
的每个实例实现外部编码(例如UTF8)的字节与字符之间的转换。最初,每个角色都是一个独立的实体,但是各种原因(主要来自C ++社区之外,特别是对Unicode的更改)导致内部角色实际上是编码本身。通常,使用的内部编码为UTF8
char
和wchar_t
的UTF16或UCS4(取决于wchar_t
是使用16位还是32位)。
由std::codecvt<...>
完成的解码转换将外部编码中的传入字节转换为内部编码的字符。例如,当外部编码为UTF8时,传入的字节将转换为32位代码点,然后通过在必要时将它们分成wchar_t
(例如,当wchar_t
为16时)将其插入UTF16字符中位)。
此过程的详细信息未指定,但它将涉及一些屏蔽和移位。此外,不同的转换将使用不同的方法。如果外部和内部编码之间的映射不像将一个Unicode表示映射到另一个表示那么简单,那么可能有合适的表提供实际的映射。
答案 2 :(得分:0)
我 中的char数组 实际上是一个UTF-8编码的字符串,然后你可以使用<转换为UTF-16编码的wchar_t数组/ p>
#include <locale>
#include <codecvt>
#include <string>
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::string narrow = converter.to_bytes(wide_utf16_source_string);
std::wstring wide = converter.from_bytes(narrow_utf8_source_string);
中有更详细的描述