wcstombs:字符编码?

时间:2010-02-03 06:50:32

标签: c character-encoding

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

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

wcstombs的典型用例是什么?

4 个答案:

答案 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_MINWCHAR_MAX的限制为[0255]或[-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字符。