在Visual Studio中,源代碼定義的字符串(如L"abc"
)會生成具有2字節寬字符的C字符串。源代碼定義的寬字符字符串和跨平臺
- Linux編譯器怎麼樣?是否也可以使用L「」語法?
- 如果是,是C字符串Linux寬字符(即4字節寬)的字符?
- 是否有「交叉編譯器」的方式來定義UCS-2或UTF-16編碼的unicode字符串?
謝謝。 :)
編輯:忘了提,我不能使用C + + 11。
在Visual Studio中,源代碼定義的字符串(如L"abc"
)會生成具有2字節寬字符的C字符串。源代碼定義的寬字符字符串和跨平臺
謝謝。 :)
編輯:忘了提,我不能使用C + + 11。
沒有使用至少C11或C++ 11(您可以使用u"..."
),沒有跨平臺的方式來方便地編寫UTF-16字符串文字。
寬字符串語法(L"..."
)使用實現定義的編碼創建const wchar_t*
。在Windows上,這種編碼是UTF-16;與GCC(使用GNU的libc),這種編碼是UTF-32。
創建UTF-16或任何UTF字符串(pre-C11/C++ 11)的唯一安全且便攜的方法是將它們寫爲整數數組。例如:
const uint16_t str[] = { 0x24EA, 0x0 };
感謝您的幫助。但是,如果我使用常規字符串,我可以得到與兩個編譯器的通用編碼?編碼是否依賴於源文件的編碼? – Virus721
嚴格地說,未加前綴的文字('「...」')也是實現定義的,但是您必須在相當深奧的平臺上尋找除ASCII以外的其他任何東西。 –
見C11標準的相關部分:http://port70.net/~nsz/c/c11/n1570.html#6.4.5 – pmg
對不起。我忘了提及我不能使用C++ 11。我會被VS2005和g ++與android NDK使用的任何版本卡在一起。 – Virus721
C11標準不是C++!無論如何,C99標準對字符串文字的選擇較少,但接受「L」foo「」(http://port70.net/~nsz/c/c99/n1256.html#6.4.5)。 – pmg