wcstombs:字符编码?

wcstombs:字符编码?,c,character-encoding,C,Character Encoding,wcstombs说,它“将宽字符代码序列转换为多字节字符串”。但它从来没有说什么是“宽字符” 它是隐式的,比如说它将utf-16转换为utf-8,或者转换是由某个环境变量定义的 另外,wcstombs的典型用例是什么?宽字符串由多字节字符组成,而普通的C字符串是一个字符*-一个字节宽字符序列。wchar在所有平台上都不同于unicode,尽管unicode表示通常基于wchar\u t 我在手机等嵌入式系统中见过wchars,在这些系统中,您希望文件名具有特殊字符,但不一定希望支持unicode

wcstombs说,它“将宽字符代码序列转换为多字节字符串”。但它从来没有说什么是“宽字符”

它是隐式的,比如说它将utf-16转换为utf-8,或者转换是由某个环境变量定义的


另外,wcstombs的典型用例是什么?

宽字符串由多字节字符组成,而普通的C字符串是一个字符*-一个字节宽字符序列。wchar在所有平台上都不同于unicode,尽管unicode表示通常基于wchar\u t

我在手机等嵌入式系统中见过wchars,在这些系统中,您希望文件名具有特殊字符,但不一定希望支持unicode的所有优点和复杂性


典型的用法是将基于2字节的字符串转换为常规C字符串,反之亦然。根据C标准,
wchar\u t
类型“能够表示当前语言环境中的任何字符”。标准没有说明
wchar\u t
的编码是什么。事实上,
WCHAR_MIN
WCHAR_MAX
的限制是[
0
255
]或[-127127],这取决于
WCHAR_t
是无符号的还是有符号的

多字节字符可以使用多个字节。多字节字符串由一个或多个多字节字符组成。在多字节字符串中,每个字符的字节数不必相等(例如UTF-8)。然而,
wchar\u t
类型的对象具有固定的大小(当然,在给定的实现中)

另外,我还可以在C99草案副本中找到以下内容:

\uu STDC\u ISO\u 10646
格式为
yyyymmL
的整数常量(例如,
199712L
)。如果定义了此符号,则当存储在
wchar\u t
类型的对象中时,Unicode必需集中的每个字符都具有与该字符的短标识符相同的值。Unicode所需集合由ISO/IEC 10646定义的所有字符以及指定年份和月份的所有修订和技术勘误组成


因此,如果我理解正确,如果定义了
\uuu STDC\u ISO\u 10646\uuuu
,那么
wchar\u t
可以存储Unicode字符。

它将平台使用的任何字符转换为“宽字符”(我相信在Windows上确实是UCS2,但在UNIX上通常是UCS4)转换为当前区域设置的默认多字节字符编码。如果您的区域设置是UTF-8,则将使用多字节编码-但请注意,还有其他可能,如JIS。

您将
setlocale()
标准函数与
LC\u CTYPE
(或
LC\u ALL
)类别设置库在
wchar\t
字符和多字节字符之间使用的映射。传递给
setlocale()
的实际语言环境名称是实现定义的,因此您需要在编译器的文档中查找它

例如,对于MSVC,您可以使用

setlocale( LC_ALL, ".1252" );
将C运行时设置为使用代码页1252作为多字节字符集。请注意,MSVC文档明确指出,对于多字节字符集,区域设置不能设置为UTF-7或UTF8:

可用语言、国家/地区代码和代码页集包括Win32 NLS API支持的所有语言、国家/地区代码和代码页,但每个字符需要两个以上字节的代码页除外,如UTF-7和UTF-8。如果提供UTF-7或UTF-8之类的代码页,setlocale将失败,返回NULL


“宽字符”
wchar\u t
类型旨在支持系统支持的任何字符集-标准不定义
wchar\u t
类型的大小(它可以小到
char
或任何较大的整数类型)。在Windows上,它是系统的“内部”Unicode编码,即UTF-16(WinXP之前的UCS-2)。老实说,我在MSVC文档中找不到直接的报价。严格地说,实现应该调用它,但我找不到它。

一个“宽字符”是一个
wchar\t
。在Windows上是UTF-16,而不是UCS2。这很公平。(这似乎有点破绽——widechars的全部要点应该是一个widechar始终恰好是一个字符)。这从来都不是真的。即使是Linux上的32位widechar也可能表示非打印元素,例如分解的重音字符的一部分,或者RTL排序指令,或者其他各种东西。因此,假设一个代码点是一个字符,无论其编码方式如何,都是不安全的。警告:setlocale中没有语言环境字符串的标准,因此跨平台执行任何操作都不容易。例如.1252在Windows上有效,但在UNIX/Linux上无效(在那里你会看到类似en_US.UTF-8或en_US.iso889-1的内容)。这可能有点混淆-在这种和类似的用法中,“多字节字符串”是由字符组成的字符串-一个“标准ansi c字符串”,但每个逻辑字符可能有一个以上的字符(字节),宽字符串通常为每个元素分配超过1个字节(sizeof(wchar_t)==2是常见的),但一开始常常错误地认为这将允许字符串中的逻辑字符数等于元素数。
wchar_MAX
的实际限制不是
255
(您可能会混淆
char
type)。根据
c11
c99
也有相同的描述):
的**WCHAR\u MAX**值应不小于255。
。实际值可能是
2147483647
。活生生的例子。我从未见过它是否是
255