本文转自 http://hotmanx.spaces.live.com/blog/cns!F8DAF1FD6C7CCDD9!140.entry?wa=wsignin1.0&sa=826499136
带L前缀的字符串字面常量
有些C++编译器支持诸如: L"一个字符串" 这样的字符串字面常量。这个 L 前缀的意义是什么?
#include <iostream>
int main() {
std::wstring s(L"字符串");
std::wcout << s << std::endl;
wchar_t* w = L"汉字";
std::cout << w << '/t' << w[0] << std::endl;
return 0;
}
/*
试验环境:WindowsXP sp2, Borland C++ 5.6/Visual C++ 6.0
- wcout 输出不受支持。其中 BC 不支持但并不报错; VC 不能编译 wcout << s;
- L前缀的字符串字面常量会被编译器编码为 UTF-16,且其类型为 const wchar_t* const; 不过,据说有的编译器中 wchar_t 是 UCS4 编码的。总之,C++标准并没有规定 wchar_t 是什么东东,只说它“应该能处理编译器所能处理的最长的字符编码”,那就是说,如果编译器只支持 ascii,wchar_t 甚至可以等于 unsigned char……
- 在这两个编译器中,wchar_t 就是 unsigned short,所以 cout << w 会输出一个指针值。
我的疑问:
编译器是如何知道源代码中是何种编码的?如果是通过宿主操作系统,那……这个代码的可移植性也太差了吧?换个操作系统语言就能编译出不一样的东东……
*/
------------------------------------------
网友回复
你的程序好象少了一个include吧
还要
#include <string>
VC6可以编译wcout<<s,但默认是不会输出中文的,你试一下把
std::wstring s(L"字符串");
改成
std::wstring s(L"hello");
就能看到输出hello了。
要输出中文的话,必须使用一个C标准函数设定locale:
setlocale(LC_ALL, ".ACP");
然后
std::wstring s(L"字符串");
std::wcout << s << std::endl;
就可以看到输出中文“字符串”了。
由于cout只认得窄字符串,在这VC6中,wchar_t就是unsigned short,cout的时候就当成短整数输出了
std::cout << w << '/t' << w[0] << std::endl;
所以这句第一个是短整数组的指针,第二个是“汉”字的UNICODE编码,呵呵。
我也是刚刚才知道这些的,在百度搜索wstring,wcout的时候找到了你这里。
还要
#include <string>
VC6可以编译wcout<<s,但默认是不会输出中文的,你试一下把
std::wstring s(L"字符串");
改成
std::wstring s(L"hello");
就能看到输出hello了。
要输出中文的话,必须使用一个C标准函数设定locale:
setlocale(LC_ALL, ".ACP");
然后
std::wstring s(L"字符串");
std::wcout << s << std::endl;
就可以看到输出中文“字符串”了。
由于cout只认得窄字符串,在这VC6中,wchar_t就是unsigned short,cout的时候就当成短整数输出了
std::cout << w << '/t' << w[0] << std::endl;
所以这句第一个是短整数组的指针,第二个是“汉”字的UNICODE编码,呵呵。
我也是刚刚才知道这些的,在百度搜索wstring,wcout的时候找到了你这里。
90

被折叠的 条评论
为什么被折叠?



