请教一个莫名其妙的问题

二拐子 2015-02-06 11:52:03
string s1 = "";
string s2 = "〇";
Console.WriteLine(s1.Equals(s2, StringComparison.CurrentCulture));

这段代码在C#中执行时,在Framework版本从2.0到3.5时,打印都是True,在4.0时打印为False;
但是下面这段代码:
int len1 = test1.Length;
int len2 = test2.Length;
Console.WriteLine("字符串 三〇一医院 的长度为:"+test1.Length);
Console.WriteLine("字符串 三一医院 的长度为:" + test2.Length);

在Framework版本从2.0到4.0时,都是输出len1=5,len2=4.

〇 作为一个汉字,95年就已经被GBK字符集收录了。

有老师帮分析下,为什么吗?就因为枚举类型为CurrentCulture的原因?
表示感谢先。

小弟没有积分,对不起了呀!
...全文
220 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
二拐子 2015-02-09
  • 打赏
  • 举报
回复
说它支持的不好,但是这个"〇"(uniconde码:U+3007)在计算字符串长度时,却是占用了一个字符的长度。 就只是在和""比较时是相等的。 不知道微软这是怎么处理的~
二拐子 2015-02-09
  • 打赏
  • 举报
回复
引用 6 楼 github_22161131 的回复:
因为字符串长度和区域化比较没有关系,.net字符串的长度是UTF-16编码的char的数量,只有区域化比较的时候才考虑那些Unicode定义的"可忽略"字符。 显然.net 4.0之前的版本并没有完全按照Unicode规范实施,从.net 4.0开始它写明了按照Unicode 5.1标准。有些信息在.net 4.0的改动里,比如可以使用<CompatSortNLSVersion enabled="4096"/>让区域化比较/排序的规则按照以前的方式进行。
明白了!多谢~
winnowc 2015-02-09
  • 打赏
  • 举报
回复
因为字符串长度和区域化比较没有关系,.net字符串的长度是UTF-16编码的char的数量,只有区域化比较的时候才考虑那些Unicode定义的"可忽略"字符。 显然.net 4.0之前的版本并没有完全按照Unicode规范实施,从.net 4.0开始它写明了按照Unicode 5.1标准。有些信息在.net 4.0的改动里,比如可以使用<CompatSortNLSVersion enabled="4096"/>让区域化比较/排序的规则按照以前的方式进行。
二拐子 2015-02-07
  • 打赏
  • 举报
回复
咋不让修改帖子了?
二拐子 2015-02-07
  • 打赏
  • 举报
回复
噢噢,不好意思,忘记贴定义的测试字符串了。 string test1 = "三〇一医院"; string test2 = "三一医院";
於黾 2015-02-07
  • 打赏
  • 举报
回复
自己断点跟,看StringComparison.CurrentCulture是什么,或者转到定义,看它到底是什么呗 也可以看看它在4.0以前的类库和在4.0以后的类库里到底有什么区别 至于你的第二段代码,根本运行不了,test1和test2都没定义
winnowc 2015-02-07
  • 打赏
  • 举报
回复
查了下,这应该是.net 2.0的时候对unicode标准支持的还不完善,在按区域比较的时候把这个U+3007当作了一个可以忽略的字符。4.0对unicode标准支持的好了,真正按照unicode定义的可忽略字符来忽略。比如在.net 4.0上,按区域比较""和"\u00AD"是相等的,但是在2.0上它们却不相等。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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