2010-02-03 138 views
3

wcstombs documentation说,它“将宽字符代码序列转换为多字节字符串”。但它从不说什么是“宽字符”。wcstombs:字符编码?

它是隐式的,如说把它转换UTF-16为UTF-8或转化是通过一些环境变量定义?

什么是wcstombs的典型用例?

+0

“宽字符”是一个'wchar_t'。 – kennytm 2010-02-03 07:08:04

回答

4

可以使用与LC_CTYPE(或LC_ALL)类别中的setlocale()标准功能设置wchar_t字符和多字节字符之间的库使用的映射。传递给setlocale()的实际语言环境名称是由实现定义的,因此您需要在编译器的文档中查找它。

例如,与MSVC您可以使用

setlocale(LC_ALL, ".1252"); 

来设置C运行时使用代码页1252作为多字节字符集。需要注意的是MSVC文件明确表明,地方不能设置为UTF-7或UTF-8多字节字符集:

一组可用的语言,国家/地区代码和代码页包括所有那些支持除了需要每个字符超过两个字节的代码页之外的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文档中找不到直接引用。严格地说,实现应该调用这个,但我找不到它。

+2

警告:setlocale中的语言环境字符串没有标准,所以跨平台任何事情都不容易。例如.1252在Windows上有效,但不在UNIX/Linux上(在这里你会看到像en_US.UTF-8或en_US.iso889-1这样的东西) – 2010-02-03 08:50:13

1

宽字符串组成的多字节字符,而正常的C字符串是一个char * - 的字节宽的字符的序列。在所有平台上,wchars与unicode并不是一回事,尽管unicode表示通常基于wchar_t

我曾经见过用于嵌入式系统(如手机)中的wchar,其中您需要具有特殊字符但不一定想要的文件名支持unicode的所有荣耀和复杂性。

典型用法是基于2字节的字符串转换为一个常规的C字符串,并且正相反

+0

这可能有点令人困惑 - 在这个和类似的用法中,“多字节字符串”是由字符串组成的字符串 - “标准ansi c-string”,但每个字符可能有多个字符逻辑字符,而宽字符串通常为每个元素分配多于1个字节(sizeof(wchar_t)== 2是常见的),通常最初会误认为这会允许字符串中的逻辑字符数等于元素数。 – 2015-09-10 18:35:37

1

根据C标准,wchar_t类型是“能够表示在当前区域设置任何字符的”。该标准没有说明wchar_t的编码是什么。实际上,取决于wchar_t是无符号还是有符号的,对于WCHAR_MINWCHAR_MAX的限制是[0,255]或[-127,127]。

多字节字符可以使用多个字节。多字节字符串由一个或多个多字节字符组成。在一个多字节字符串中,每个字符不需要有相同的字节数(UTF-8就是一个例子)。而类型wchar_t的对象具有固定大小(当然,在给定的实现中)。

顺便说一句,我也可以找到自己的C99草案副本中的以下:

__STDC_ISO_10646__形式yyyymmL(例如,199712L)的整型常量。如果定义了这个符号,那么当存储在类型为wchar_t的对象中时,Unicode所需的每个字符与该字符的短标识符具有相同的值。 Unicode要求的集合包括ISO/IEC 10646定义的所有字符,以及截至指定年份和月份的所有修订和技术勘误。

所以,如果我理解正确的,如果__STDC_ISO_10646__定义,然后wchar_t可以存储Unicode字符。

+0

'WCHAR_MAX'的实际限制不是'255'(你可能会混淆'char'类型)。根据'c11'('c99'也有相同的描述):** WCHAR_MAX **的值应不小于255.'。实际值可能是'2147483647'。现场示例[这里](http://melpon.org/wandbox/permlink/zQmKmfSJET4nHkcY)。我从未看过它是否是'255'。 – alexolut 2016-02-20 11:22:36

3

它将您的平台用于“宽字符”(我确信Windows确实是UCS2,但通常是UNIX上的UCS4)转换为当前语言环境的默认多字节字符编码。如果您的语言环境是UTF-8,那么这就是将要使用的多字节编码 - 但请注意,还有其他可能性,例如JIS。

+2

在Windows上是UTF-16,而不是UCS2。 – 2010-02-03 08:48:02

+0

够公平的。 (这看起来有些破裂 - 宽广的整点应该是一个widechar总是只有一个字符)。 – caf 2010-02-03 22:10:24

+0

这从来都不是真的。即使是Linux上的32位宽度代码也可能表示非打印元素,例如分解重音字符的一部分,或RTL排序指令,或其他所有类型的东西。因此,假定一个代码点是一个字符,不管编码如何,都是不安全的。 – Miral 2017-12-14 00:49:51