第一个问题的一个非常部分的答案:文件是一个字节序列,因此,在处理wchar_t
's 时,至少必须在and之间进行一些转换。进行这种“智能”转换需要了解字符编码,因此这就是允许这种转换依赖于语言环境的原因,因为在流的语言环境中使用了一个方面。wchar_t
char
然后,问题是如何在标准要求的唯一语言环境中进行转换:“经典”语言环境。对此没有“正确”的答案,因此标准对此非常模糊。我从您的问题中了解到,您认为在 wchar_t[] 和 char[] 之间盲目地强制转换(或 memcpy()-ing)是一个好方法。这不是不合理的,实际上是(或至少是)在某些实现中所做的。
另一个 POV 是,由于 codecvt 是一个语言环境方面,因此可以合理地预期转换是使用“语言环境的编码”进行的(我在这里是手动的,因为这个概念很模糊)。例如,人们会期望土耳其语语言环境使用 ISO-8859-9,或者日语语言环境使用 Shift JIS。通过相似性,“经典”语言环境将转换为此“语言环境的编码”。显然,微软选择了简单的修剪(如果我们假设它代表 UTF-16 并且我们停留在基本的多语言平面,这会导致 IS-8859-1 wchar_t
),而我所知道的 Linux 实现决定坚持使用 ASCII。
对于你的第二个问题:
另外,我们是要使用 C++0x 获得真正的 unicode 流,还是我在这里遗漏了什么?
在 n2857(我手头最新的 C++0x 草案)的 [locale.codecvt] 部分中,可以阅读:
专业化codecvt<char16_t, char, mbstate_t>
在 UTF-16 和 UTF-8 编码方案codecvt <char32_t, char, mbstate_t>
之间转换,专业化在 UTF-32 和 UTF-8 编码方案之间转换。codecvt<wchar_t,char,mbstate_t>
在窄字符和宽字符的本机字符集之间进行转换。
在 [locale.stdcvt] 部分,我们发现:
对于 facet codecvt_utf8
: — facet 应在程序内的 UTF-8 多字节序列和 UCS2 或 UCS4(取决于 Elem 的大小)之间转换。[...]
对于 facet codecvt_utf16
: — facet 应在程序内的 UTF-16 多字节序列和 UCS2 或 UCS4(取决于 Elem 的大小)之间转换。[...]
对于构面codecvt_utf8_utf16
: — 构面应在程序内的 UTF-8 多字节序列和 UTF-16(一个或两个 16 位代码)之间转换。
所以我想这意味着“是”,但您必须更准确地了解“真正的 unicode 流”的含义才能确定。