bool
Judge(
string
s1,
string
s2)
{
if
(
string
.IsNullOrEmpty(s1) ||
string
.IsNullOrEmpty(s2))
return
true
;
if
(s1.Length < s2.Length)
return
true
;
var
ci = StringComparison.InvariantCulture;
var
b1 =
string
.Compare(s1.Substring(0, s2.Length), s2, ci) == 0;
var
b2 = s1.StartsWith(s2, ci);
return
b1 == b2;
}
|
请问以上方法能够返回 false ?
如果可以,请给出相应的 s1 和 s2。
话说某国国防部的机密资料锁在一个保险柜里,需要输入一串密码才能打开该保险柜。
现在我方的间谍想办法搞到了该保险柜智能控制系统的关键源程序代码,如下:
1
2
3
4
5
|
bool
Locked(
string
key)
{
if
(
string
.Compare(key,
""
, StringComparison.InvariantCulture) != 0)
return
true
;
return
key.Trim(
'\0'
).Length == 0;
}
|
只要输入适当的 key,使 Locked 方法返回 false 就能打开该保险柜,获取机密资料。
现在就看你的了,赶快给出答案吧。
以上两道题是我于2009年4月份在优快云论坛上发表的“出一道有关 C# 字符串比较的考题”和“C# 字符串比较问题”中提出的。
现在,让我们先来看一些有趣的 Unicode 字符:
要过年了,大家都坐下来打麻将吧。
上述麻将牌中的“竹”(��)是 U+1F024,HTML 代码表示为: 🀤 。在 C# 语言中表示为: "��" 或者 "\xd83c\xdc24"。
虽然 "\xd83c\xdc24" 只表示一个 Unicode 字符,但是 "\xd83c\xdc24".Length == 2。
还有:
这个 Unicode 区块“组合变音标记”中的字符是解决第一道题的关键。
Judge(
"u\x0308"
,
"u"
)
|
以上代码就返回 false。
实际上:
"u\x0308".Length == 2
"u\x0308".Normalize().Length == 1
"u\x0308".Normalize() 就是 "\x00fc"
HTML 代码: ü 表示 ü (0x0308 的十进制是 776)
HTML 代码: ü 表示 ü (0x00fc 的十进制是 252)
如下所示: