首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

万恶的linux - 一个大小写引发的血案解决方法

2012-05-02 
万恶的linux -- 一个大小写引发的血案是看下面代码:C/C++ codeint main(void){wprintf(L%s\n, Lhello w

万恶的linux -- 一个大小写引发的血案
是看下面代码:

C/C++ code
int main(void){    wprintf(L"%s\n", L"hello world");   // line 1    wprintf(L"%s\n", "hello world"); // line 2    wprintf(L"%S\n", L"hello world"); // line 3    wprintf(L"%S\n", "hello world"); //line 4    printf("%s\n", L"hello world");   // line 5    printf("%s\n", "hello world"); // line 6    printf("%S\n", L"hello world"); // line 7    printf("%S\n", "hello world"); //line 8        return 0;}


在当前的ubuntu上运行输出的结果为:
line1 -- h
line2 -- hello world
line3 -- hello world
line4 -- ?s@!@!(乱码)
line5 -- h
line6 -- hello world
line7 -- hello world
line8 -- 无输出

只因为%s转义符小写s是针对窄字符的 大写转义符S是针对宽字符的 Linux下竟然使用这种硬编码的方式来区分宽窄字符版本
在Windows平台上上面输出的情况也有类似问题 但情况较好 Windows上小写s格式同时兼容宽窄字符模式 但在linux上 输出窄字符只能用小写 输出宽字符 只能用大写 这是一种非常悲剧的情况 这种硬编码的风格将使跨平台的成为泡沫 因为下面这段代码是在linux unicode的编译环境是十分悲剧的:

C/C++ code
#if defined(UNICODE)typedef wchar_t MyTchar;#define MyTprintf wprintf#define MyText(t) (L##t) #elsetypedef char MyTchar#define MyTprintf printf#define MyText(t) (t)#endif//.. some placeMyTchar * name = getName();MyTprintf(MyText("name=%s"), name);


难怪有不少平台 都会实现自己的字符串函数族 但如果是不得不依赖gnu的情况下 有什么办法可以避免这种问题么 能否有人给出些建议 多谢了

[解决办法]
这跟linux有啥关系, 世界上就没比M$更不遵循标准的了. linux大家都用UTF-8, UCS-2 UCS-4基本就是后娘养的, 也没见啥不方便的.

[解决办法]
避免就是不用或者慎用,gcc中宽字符和普通字符流的方向还不同,不要混用
[解决办法]
linux窄字符用的应该是unicode,windows默认是ANSI。
[解决办法]
探讨

linux窄字符用的应该是unicode,windows默认是ANSI。

[解决办法]
s : When used with printf functions, specifies a single-byte-character string; when used with wprintf functions, specifies a wide-character string. Characters are printed up to the first null character or until the precision value is reached.
__________________________________

S : When used with printf functions, specifies a wide-character string; when used with wprintf functions, specifies a single-byte-character string. Characters are printed up to the first null character or until the precision value is reached.


[解决办法]
探讨
万恶的linux

[解决办法]
公平的说,Windows内核使用UTF16,宽字符,所以必须从内核层面就把宽字符的支持做好否则连内核都写不出来,因此,Windows宽字符支持明显好于Linux。

Linux使用UTF8,UTF8本身就是用char*存储的。而且,UTF8除英文外其他都是二等公民,只有在软件国际化时才会用到,内核中一个字符肯定是一个字节
[解决办法]
你不用宽字符,就没有这些问题。

热点排行