2015-05-11 103 views
1

在Visual Studio中,源代碼定義的字符串(如L"abc")會生成具有2字節寬字符的C字符串。源代碼定義的寬字符字符串和跨平臺

  • Linux編譯器怎麼樣?是否也可以使用L「」語法?
  • 如果是,是C字符串Linux寬字符(即4字節寬)的字符?
  • 是否有「交叉編譯器」的方式來定義UCS-2或UTF-16編碼的unicode字符串?

謝謝。 :)

編輯:忘了提,我不能使用C + + 11。

+0

見C11標準的相關部分:http://port70.net/~nsz/c/c11/n1570.html#6.4.5 – pmg

+0

對不起。我忘了提及我不能使用C++ 11。我會被VS2005和g ++與android NDK使用的任何版本卡在一起。 – Virus721

+1

C11標準不是C++!無論如何,C99標準對字符串文字的選擇較少,但接受「L」foo「」(http://port70.net/~nsz/c/c99/n1256.html#6.4.5)。 – pmg

回答

1

沒有使用至少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 }; 
+0

感謝您的幫助。但是,如果我使用常規字符串,我可以得到與兩個編譯器的通用編碼?編碼是否依賴於源文件的編碼? – Virus721

+0

嚴格地說,未加前綴的文字('「...」')也是實現定義的,但是您必須在相當深奧的平臺上尋找除ASCII以外的其他任何東西。 –