C# 字符串比较问题 本帖最后由 wuyi8808 于 2009-04-15 21:22:56 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 key = "\0"; //转义符是反斜杠\ key = "\0"感觉是这个 7 楼的解是正确的。现在改进一下 Locked 方法,大家继续。bool Locked(string key){ if (string.Compare(key, "", StringComparison.InvariantCulture) != 0) return true; return key.Trim("\0").Length == 0;} 更正一下,16楼的代码应该是:bool Locked(string key){ if (string.Compare(key, "", StringComparison.InvariantCulture) != 0) return true; return key.Trim('\0').Length == 0;} 顺便贴出楼主昨天的帖子,以供大家参考:http://topic.csdn.net/u/20090414/19/703ffce1-1b2e-4980-aea4-f9aa62038f81.html //以下值都return false。key="\u11A3";key="\u11A4";key="\u11A5";key="\u11A6";key="\u11A7"; 23楼和24楼的解是正确的。另外,以下的 key 值也可以使 Locked 方法返回 false :"\0xFFFF""\0xFFFE""\0xFFFD"..."\0xFF00" 如果var s1 = "Mu\x0308nchen";var s2 = s1.Normalize();那么,我们有:string.Compare(s1, s2, StringComparison.InvariantCulture) == 0但是:s1.Length != s2.Length。这也是一个有趣的事实。 ojlovecd 版主的答案是类似这样子的:using System.Text;// ...key = Encoding.Unicode.GetString(Encoding.ASCII.GetBytes("A")); 看大家如此热烈, 就出来人讲讲吧实在没看懂啥意思....也讲讲, 让像我一样puzzle的人有所收获啊! A similar oddity would be characters with no weight like U+FFFD. So if I have str = "A\xFFFD\xFFFD\xFFFD", then all of str.Substring(0,1) == str.Substring(0,2) == str.Substring(0,3) == str.Substring(0,4) == "A". And in this case str.StartsWith("A") would be true.但是我试验了下:string str2 = "A\xFFFD\xFFFD\xFFFD"; string find2 = "A"; Console.WriteLine("str2 = " + str2); Console.WriteLine("1 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"); Console.WriteLine("Substring: " + (str2.Substring(0, 1) == find2) + " Substring is:" + str2.Substring(0, 1)); Console.WriteLine("StartsWith:" + str2.StartsWith(find2)); Console.WriteLine("IndexOf: " + str2.IndexOf(find2)); Console.WriteLine("2 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"); Console.WriteLine("Substring: " + (str2.Substring(0, 2) == find2) + " Substring is:" + str2.Substring(0, 2)); Console.WriteLine("StartsWith:" + str2.StartsWith(find2)); Console.WriteLine("IndexOf: " + str2.IndexOf(find2)); Console.WriteLine("3 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"); Console.WriteLine("Substring: " + (str2.Substring(0, 3) == find2) + " Substring is:" + str2.Substring(0, 3)); Console.WriteLine("StartsWith:" + str2.StartsWith(find2)); Console.WriteLine("IndexOf: " + str2.IndexOf(find2)); Console.WriteLine("4 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"); Console.WriteLine("Substring: " + (str2.Substring(0, 4) == find2) + " Substring is:" + str2.Substring(0, 4)); Console.WriteLine("StartsWith:" + str2.StartsWith(find2)); Console.WriteLine("IndexOf: " + str2.IndexOf(find2));1 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-Substring: True Substring is:AStartsWith:TrueIndexOf: 02 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-Substring: False Substring is:A?StartsWith:TrueIndexOf: 03 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-Substring: False Substring is:A??StartsWith:TrueIndexOf: 04 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-Substring: False Substring is:A???StartsWith:TrueIndexOf: 0结果是 str.Substring(0,3) == str.Substring(0,4) == "A". 都不成立啊 目前,所有没清楚本贴写的是什么的朋友, 试试下面这段代码, 跟踪一下,就该清楚了. 如果还不清楚的话, 看看t 的值 ! string str1 = "Mu\x0308nchen";string t = "x\x0308";string str = "Muchen";string find = "Mu";Console.WriteLine("Substring: " + (str.Substring(0, 2) == find) + " Substring is:" +str.Substring(0, 2));Console.WriteLine("StartsWith:" + str.StartsWith(find));Console.WriteLine("IndexOf: " + str.IndexOf(find)); 思路是去掉转义字符 \0 绕过第一道防线·string 字符格式 默认以 \0 作为结束符号 (有C基础的都知道)36楼的 兄弟·已经给出了绕 \0 的方法 下面是正解之一 KEY 一个空格即可 class Program { static void Main(string[] args) { bool isok =true; while(isok) { isok = Locked(Encoding.Unicode.GetString(Encoding.ASCII.GetBytes(Console.ReadLine()))); Console.WriteLine("{0}", isok); } Console.WriteLine("解除{0}", !isok); Console.ReadLine(); } static bool Locked(string key) { if (string.Compare(key, "", StringComparison.InvariantCulture) != 0) return true; return key.Trim('\0').Length == 0; } } 没看明 return true or false 有什么用 能不能说说原理啊?string str1 = "Mu\x0308nchen";string t = "x\x0308";\x0308是什么意思? C# Winform关于长时间没操作时返回主界面的问题 谁有TFS2010 64位 还有DxExpress7.2 怎样让 SortedList 类不自动排序 ==在线等 去掉datalist 里<ItemTemplate>生成的tr td datagridview 去除选中行 求正则表达式 关于DS自增列的问题,请大家帮忙谢谢! WCF 部署在WindowsService 上 求助 异步Socket!我的毕业设计,大侠们救命啊! 如何在listview里设列表头图片 C# 判断一个控件距显示器底部的距离 弱弱地问一下System.Threading.Timer 暂停方法
感觉是这个
现在改进一下 Locked 方法,大家继续。bool Locked(string key)
{
if (string.Compare(key, "", StringComparison.InvariantCulture) != 0) return true;
return key.Trim("\0").Length == 0;
}
{
if (string.Compare(key, "", StringComparison.InvariantCulture) != 0) return true;
return key.Trim('\0').Length == 0;
}
http://topic.csdn.net/u/20090414/19/703ffce1-1b2e-4980-aea4-f9aa62038f81.html
key="\u11A4";
key="\u11A5";
key="\u11A6";
key="\u11A7";
另外,以下的 key 值也可以使 Locked 方法返回 false :
"\0xFFFF"
"\0xFFFE"
"\0xFFFD"
...
"\0xFF00"
var s1 = "Mu\x0308nchen";
var s2 = s1.Normalize();那么,我们有:
string.Compare(s1, s2, StringComparison.InvariantCulture) == 0但是:
s1.Length != s2.Length。这也是一个有趣的事实。
ojlovecd 版主的答案是类似这样子的:using System.Text;
// ...
key = Encoding.Unicode.GetString(Encoding.ASCII.GetBytes("A"));
实在没看懂啥意思....也讲讲, 让像我一样puzzle的人有所收获啊!
但是我试验了下:string str2 = "A\xFFFD\xFFFD\xFFFD";
string find2 = "A"; Console.WriteLine("str2 = " + str2);
Console.WriteLine("1 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
Console.WriteLine("Substring: " + (str2.Substring(0, 1) == find2) + " Substring is:" + str2.Substring(0, 1));
Console.WriteLine("StartsWith:" + str2.StartsWith(find2));
Console.WriteLine("IndexOf: " + str2.IndexOf(find2)); Console.WriteLine("2 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
Console.WriteLine("Substring: " + (str2.Substring(0, 2) == find2) + " Substring is:" + str2.Substring(0, 2));
Console.WriteLine("StartsWith:" + str2.StartsWith(find2));
Console.WriteLine("IndexOf: " + str2.IndexOf(find2)); Console.WriteLine("3 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
Console.WriteLine("Substring: " + (str2.Substring(0, 3) == find2) + " Substring is:" + str2.Substring(0, 3));
Console.WriteLine("StartsWith:" + str2.StartsWith(find2));
Console.WriteLine("IndexOf: " + str2.IndexOf(find2)); Console.WriteLine("4 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
Console.WriteLine("Substring: " + (str2.Substring(0, 4) == find2) + " Substring is:" + str2.Substring(0, 4));
Console.WriteLine("StartsWith:" + str2.StartsWith(find2));
Console.WriteLine("IndexOf: " + str2.IndexOf(find2));
1 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Substring: True Substring is:A
StartsWith:True
IndexOf: 0
2 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Substring: False Substring is:A?
StartsWith:True
IndexOf: 0
3 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Substring: False Substring is:A??
StartsWith:True
IndexOf: 0
4 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Substring: False Substring is:A???
StartsWith:True
IndexOf: 0
结果是 str.Substring(0,3) == str.Substring(0,4) == "A". 都不成立啊
如果还不清楚的话, 看看t 的值 ! string str1 = "Mu\x0308nchen";
string t = "x\x0308";
string str = "Muchen";
string find = "Mu";
Console.WriteLine("Substring: " + (str.Substring(0, 2) == find) + " Substring is:" +str.Substring(0, 2));
Console.WriteLine("StartsWith:" + str.StartsWith(find));
Console.WriteLine("IndexOf: " + str.IndexOf(find));
string 字符格式 默认以 \0 作为结束符号 (有C基础的都知道)
36楼的 兄弟·已经给出了绕 \0 的方法 下面是正解之一 KEY 一个空格即可
class Program
{
static void Main(string[] args)
{
bool isok =true;
while(isok)
{
isok = Locked(Encoding.Unicode.GetString(Encoding.ASCII.GetBytes(Console.ReadLine()))); Console.WriteLine("{0}", isok);
}
Console.WriteLine("解除{0}", !isok);
Console.ReadLine();
} static bool Locked(string key)
{
if (string.Compare(key, "", StringComparison.InvariantCulture) != 0) return true;
return key.Trim('\0').Length == 0;
} }
string str1 = "Mu\x0308nchen";
string t = "x\x0308";
\x0308是什么意思?