char和wchar_t之间的转换如何在Windows中运行?

时间:2015-12-04 11:17:13

标签: c++ windows character-encoding

在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的概念似乎完全无关紧要。

3 个答案:

答案 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 charwchar_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);

https://stackoverflow.com/a/18597384/6345

中有更详细的描述