wcstombs documentation说,它“将宽字符代码序列转换为多字节字符串”。但它从来没有说过什么是“广角”。
它是否隐含,比如说它将utf-16转换为utf-8或转换是由某个环境变量定义的?
wcstombs的典型用例是什么?
答案 0 :(得分:4)
您使用setlocale()
标准函数和LC_CTYPE
(或LC_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_t
类型旨在支持系统支持的任何字符集 - 标准不定义wchar_t
类型的大小(它可以是小char
或任何较大的整数类型)。在Windows上,它是系统的“内部”Unicode编码,即UTF-16(WinXP之前的UCS-2)。老实说,我在MSVC文档中找不到直接引用。严格地说,实现应该调用它,但我找不到它。
答案 1 :(得分:3)
它会将您的平台用于“宽字符”(我认为在Windows上确实是UCS2,但在UNIX上通常是UCS4)转换为您当前语言环境的默认多字节字符编码。如果您的语言环境是UTF-8,那么这将是将要使用的多字节编码 - 但请注意,还有其他可能性,例如JIS。
答案 2 :(得分:1)
宽字符串由多字节字符组成,而普通C字符串是char * - 字节宽度字符序列。 Wchars与所有平台上的unicode不同,尽管unicode表示通常基于wchar_t
我见过像手机这样的嵌入式系统中使用的wchars,你希望文件名具有特殊字符,但不一定要支持unicode的所有荣耀和复杂性。
典型用法是将基于2字节的字符串转换为常规C字符串,反之亦然
答案 3 :(得分:1)
根据C标准,wchar_t
类型“能够表示当前语言环境中的任何字符”。该标准没有说明wchar_t
的编码是什么。事实上,WCHAR_MIN
和WCHAR_MAX
的限制为[0
,255
]或[-127,127],具体取决于wchar_t
是否为无符号或签名。
多字节字符可以使用多个字节。多字节字符串由一个或多个多字节字符组成。在多字节字符串中,每个字符不必具有相同的字节数(UTF-8就是一个例子)。然而,wchar_t
类型的对象具有固定的大小(当然,在给定的实现中)。
顺便说一句,我也可以在我的C99草案副本中找到以下内容:
__STDC_ISO_10646__
yyyymmL
形式的整数常量(例如,199712L
)。如果定义了此符号,则Unicode所需集中的每个字符在存储在类型wchar_t
的对象中时,与该字符的短标识符具有相同的值。 Unicode必需集包含ISO / IEC 10646定义的所有字符,以及指定年份和月份的所有修订和技术勘误。
因此,如果我理解正确,如果定义了__STDC_ISO_10646__
,则wchar_t
可以存储Unicode字符。