2013-02-04 37 views
2

我知道UTF-16有兩種類型的字節順序:大字節和小字節。什麼是std :: wstring的標準定義的字節順序?

請問C++標準定義的std :: wstring的的字節序?或者它是實現定義的?

如果它是標準的定義,它的C++標準的網頁提供有關這個問題的規則?

如果是實現定義的,如何確定它?例如在VC++下。編譯器是否確保std :: wstring的字節序嚴格依賴於處理器?

我必須知道這一點;因爲我想將UTF-16字符串發送給其他人。我必須在UTF-16字符串的開頭添加正確的BOM以指示其字節順序。

總之:給定一個std :: wstring的,我應該如何可靠地確定它的字節順序?

+4

該標準甚至沒有指定'wchar_t'有多大,它不會給出字節序。 –

+1

爲什麼你需要知道這個?字節序大多是依賴於結構的。 –

+0

@EgalGray,我必須知道這一點,因爲我想將UTF-16字符串發送給其他人。我必須在開始時添加正確的BOM。 – xmllmx

回答

5

Endianess是機器依賴的,不依賴於語言。 Endianess由處理器定義,以及它如何將數據安排在內存中和內存之外。在處理wchar_t(它比單個字節寬)時,處理器本身在讀或寫時會根據需要對齊多個字節,以便再次將其讀回或寫回RAM。代碼只是將其視爲處理器內部寄存器中表示的16位(或更大)字。

爲了確定(如果這真的是你想要做的)endianess(你自己),你可以嘗試寫一個KNOWN 32位(無符號整數)值到ram,然後用char指針讀回它。查找返回的順序。

這將是這個樣子:

unsigned int aVal = 0x11223344; 
char * myValReadBack = (char *)(&aVal); 

if(*myValReadBack == 0x11) printf("Big endian\r\n"); 
else      printf("Little endian\r\n"); 

我敢肯定還有其他的方法,但像上面應該工作,檢查我的小對比,雖然:-)

此外,Windows之前RT,VC++實際上只編譯爲intel類型的處理器。他們實際上只有1個endianess類型。

+0

謝謝。 MSDN的哪一頁指定「VC++真的只編譯爲intel類型的處理器,它們實際上只有1個字節類型。」? – xmllmx

+0

@xmllmx - 沒有MSDN可以這麼說。這是我自己的結論。 VC++是微軟C++編譯器。 Windows只有在X86處理器上存在Windows 8 RT之前。 X86處理器一直是Little Endian。看看這裏:http://en.wikipedia.org/wiki/Endianness。現在,如果您正在發送或接收來自大型機器,您可能必須轉換爲/來自,但如果你所要做的只是理解你自己的內部機器的endian類型,這甚至不需要代碼,你應該只是能夠知道(在你的情況下是「little endian」) – trumpetlicks

+1

@trumpetlicks在Windows RT之前,Windows已經存在於非x86平臺(比如PPC),並且Visual C++也存在。不過,我確實記得,它從來就不是小尾巴以外的東西。有些處理器確實支持big-endian模式和little-endian模式,但Windows需要這些處理器以little-endian模式運行。 – hvd

2

它是實現定義的。 wstring只是一個wchar_t字符串,可以是任何字節排序,或者就此而言,可以是任何舊的大小。

+0

如果是實現定義的,那麼如何確定它呢?例如在VC++下。 – xmllmx

+1

它將包含你放入的任何內容。在VC++中,wchar_t是16位,並且如果從WinAPI獲取字符串,則它們將具有本機硬件字節順序。 – bmargulies

0

wchar_t不需要在內部使用UTF-16,而UTF-16的字節順序不會影響wchar的存儲方式,而是存儲和讀取它的問題。

你必須在任何地方使用發送之前轉換的wstring爲UTF-16字節流的明確程序。 wchar的內部排序依賴於體系結構,最好使用一些不透明的接口進行轉換,而不是嘗試手動轉換它。

+0

編譯器是否確保std :: wstring的字節序嚴格依賴於處理器? – xmllmx

+0

@xmllmx不,它沒有。這就是爲什麼我建議不要搞亂wstring的內部,並使用一些標準接口來正確轉換它。 –

+0

問題仍未解決。給定一個std :: wstring,我應該如何可靠地確定它的字節順序? – xmllmx

-1

對於發送正確的BOM的目的,你不需要知道字節序。只需使用代碼\ uFEFF即可。這將是bigendian或little-endian取決於您的實施的endianness。你甚至不需要知道你的實現是UTF-16還是UTF-32。只要它是一些unicode編碼,就會得到適當的BOM。

不幸的是,wchars也不寬流被保證是Unicode。

相關問題