才注意到, 这两种写法是不同的!

cczlp 2008-12-16 09:32:20
	String s1 = L"====="
L"这是中文";
String s2 = L"====="
"这是中文";
Memo1->Lines->Add(s1);
Memo1->Lines->Add(s2);

大家试试, 设置Memo1字体为中文字体. 我的是CB2009,看看结果,很有意思吧.
...全文
141 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxw1987628 2008-12-16
  • 打赏
  • 举报
回复

// 这种连接字符串字面值 和宽字符串值的行为是未定义的。

// 结果是未定义的(undefined)你可以参考C++ primer,上面有谈到的


___NULL 2008-12-16
  • 打赏
  • 举报
回复
嗯,应该算Bug,不过这个Bug只要注意书写格式,很容易避免
___NULL 2008-12-16
  • 打赏
  • 举报
回复
一个带Unicode一个不带Unicode
而不带Unicode的被强制识别成Unicdoe当然会出现这样的情况
僵哥 2008-12-16
  • 打赏
  • 举报
回复
其中对于非双字节(多字节)字符是做了转换的,所以称之为BUG不足为奇
cczlp 2008-12-16
  • 打赏
  • 举报
回复
老僵说的有理, 编译器是根据第一串前面是否有L来认定整个字符串.
cczlp 2008-12-16
  • 打赏
  • 举报
回复
	char *cs = "123"
"中国"
L"abcde";
wchar_t *ws = L"123"
L"中国"
"abcde";
wchar_t *ws2 = L"123"
"中国"
"abcde";
ShowMessage(cs + String(":") + IntToStr((int)strlen(cs))); //显示:123中国abcde:12
ShowMessage(ws + String(":") + IntToStr((int)wcslen(ws))); //显示:123中国abcde:10
ShowMessage(ws2 + String(":") + IntToStr((int)wcslen(ws2))); //显示:123훐맺abcde:10 //似乎是韩文, 靠


zhgwbzhd 2008-12-16
  • 打赏
  • 举报
回复
谢谢僵哥的详细指点。

有多学了一点。
僵哥 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cczlp 的回复:]
引用 2 楼 unsigned 的回复:
String s2 = L"====="
"这是中文";
本来这写法就是有问题的。
一般建议使用续行符
String s2 = L"=====\
这是中文";

字符串在不同行有这两种写法, 用 \必须下行顶格写, 但排版很难看. 一楼的是另外一种写法,如果不涉及宽字符,
个人认为还是用""方式好.
[/Quote]
我的意思是指,两行写的是不同的字符串表达式。
僵哥 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhgwbzhd 的回复:]
我的事bcb6,设置与不设置成中文,都显示“????”。

不过俺弱弱的问一下,为什么要增加那个“L”??
[/Quote]
L""用来告诉编译器引号当中的内容要编译成Unicode,否则会被编译成当前系统本地编码的ANSI字符。

比如"中",就会被编译成"\xD6\xD0"而L"中",则被编译成L"\x2D4E",或者字节码"\x4E\x2D";
在编译的时候编译器会以第一个串的编码为最终解释编码。
比如:
AnsiString Str = "国"L"中";和AnsiString Str = L"中""国";就会是完全不同的两个结果
"国"L"中",首先会认为整个编译的最终串存储码为ANSI码,从而会把Unicode的"中"字当中两个字节"\x4E\x2D"从而形成最终的串是"\xB9\xFA\x4E\x2D"
而L"中""国",则会以Unicode码进行存储,从而就把"国"当成了一个Unicode(说实话,这其实按理应当算是编译器的一个BUG),直接就把"国"的ANSI当成了Unicode码L"\xB9FA"。
cczlp 2008-12-16
  • 打赏
  • 举报
回复
String s2 = L"====="
"这是中文";
我本来是这样写的 String s2 = TEXT("====="
"这是中文");
结果相同.
cczlp 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yumikoo 的回复:]
米用过2009。
是不是变成繁体了?还是?
[/Quote]
不是繁体也不是一般的乱码, 这是我最不理解的.
cczlp 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 unsigned 的回复:]
String s2 = L"====="
"这是中文";
本来这写法就是有问题的。
一般建议使用续行符
String s2 = L"=====\
这是中文";
[/Quote]
字符串在不同行有这两种写法, 用 \必须下行顶格写, 但排版很难看. 一楼的是另外一种写法,如果不涉及宽字符,
个人认为还是用""方式好.
zhgwbzhd 2008-12-16
  • 打赏
  • 举报
回复
我的事bcb6,设置与不设置成中文,都显示“????”。

不过俺弱弱的问一下,为什么要增加那个“L”??
僵哥 2008-12-16
  • 打赏
  • 举报
回复
抱歉,续行的时候,应该要顶格写
僵哥 2008-12-16
  • 打赏
  • 举报
回复
String s2 = L"====="
"这是中文";
本来这写法就是有问题的。
一般建议使用续行符
String s2 = L"=====\
这是中文";
yumikoo 2008-12-16
  • 打赏
  • 举报
回复
米用过2009。
是不是变成繁体了?还是?

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧