2010-02-03 130 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