今天碰到一个奇怪的问题,就是判断一个字符串是否含有另外一个字符串,常规我就用indexof判断,结果客户反馈程序出问题了。
我查了查,居然是indexof出的问题,明明是不含有的居然返回了0,晕死!!!
不过问题还得给解决,看了我的那几个字符串大致猜测是编码问题造成的,我的那两个串都是藏语的,不知c#indexof内部是怎么处理的
反正直接返回0,我又在网上查了查资料,发现用字符串unicode值来匹配的话方便一点,于是,找了一个字符串转unicode的函数,调用了一下最算ok了:
StringToUnicode(row2[0].ToString())
"\\u3014\\u0F41\\u0F58\\u0F66\\u3015"
注: 上图中每一个
http://www.cnblogs.com/jacky0952/admin/file:////U之间其实都是一个UNICODE字符
Code
/// <summary>
/// 将原始字串转换为unicode,格式为\u.\u.
/// </summary>
/// <param name="srcText"></param>
/// <returns></returns>
private string StringToUnicode(string srcText)
{
string dst = "";
char[] src = srcText.ToCharArray();
for (int i = 0; i < src.Length; i++)
{
byte[] bytes = Encoding.Unicode.GetBytes(src[i].ToString());
string str = @"\u" + bytes[1].ToString("X2") + bytes[0].ToString("X2");
dst += str;
}
return dst;
}
/// <summary>
/// 将Unicode字串\u.\u.格式字串转换为原始字符串
/// </summary>
/// <param name="srcText"></param>
/// <returns></returns>
private string UnicodeToString(string srcText)
{
string dst = "";
string src = srcText;
int len = srcText.Length / 6;
for (int i = 0; i <= len - 1; i++)
{
string str = "";
str = src.Substring(0, 6).Substring(2);
src = src.Substring(6);
byte[] bytes = new byte[2];
bytes[1] = byte.Parse(int.Parse(str.Substring(0, 2), NumberStyles.HexNumber).ToString());
bytes[0] = byte.Parse(int.Parse(str.Substring(2, 2), NumberStyles.HexNumber).ToString());
dst += Encoding.Unicode.GetString(bytes);
}
return dst;
} 另外的sql-server处理也有类似的问题,记得以前写t-sql直接查询的时候居然全部匹配,后来发现sql-server在这个方面也得自己写函数进行转化。
看了上面的函数,大致明白基本思路就是一个字符一个字符的翻译,在sql-server中也是一致的。
IF( UNICODE(SUBSTRING(@nstringA, @position, 1))= UNICODE(SUBSTRING(@nstringB, @position, 1)))
SET @position = @position + 1