看来对“样”不能转换啊。
换个方法吧string srtins = "大家最近怎么样?";
string strUtf= Encoding.GetEncoding("GB2312").GetString(Encoding.Unicode.GetBytes(srtins));
string strRet= Encoding.Unicode.GetString( Encoding.GetEncoding("GB2312").GetBytes(strUtf));
Response.Write(strRet + "<br>");
换个方法吧string srtins = "大家最近怎么样?";
string strUtf= Encoding.GetEncoding("GB2312").GetString(Encoding.Unicode.GetBytes(srtins));
string strRet= Encoding.Unicode.GetString( Encoding.GetEncoding("GB2312").GetBytes(strUtf));
Response.Write(strRet + "<br>");
楼主要进行编码转换应该用这个,而不是在各个编码间编来编去。string srtins = "大家最近怎么样?";
byte[] bs = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("GB2312"),
Encoding.UTF8.GetBytes(srtins) );
string strUtf = Encoding.GetEncoding("GB2312").GetString(bs);bs = Encoding.Convert(Encoding.GetEncoding("GB2312"), Encoding.UTF8, bs);
string strRet= Encoding.UTF8.GetString(bs);
string srtins = "大家最近怎么样?";
byte[] bs = Encoding.Convert(Encoding.GetEncoding("GB2312"),Encoding.UTF8,
Encoding.UTF8.GetBytes(srtins) );
string strUtf = Encoding.UTF8.GetString(bs);bs = Encoding.Convert(Encoding.UTF8,Encoding.GetEncoding("GB2312"), bs);
string strRet= Encoding.UTF8.GetString(bs);
输出的效果还是一样的"是大家最近怎么?"
还有没有别的方法呢?这个究竟是.net的问题呢,还是windows的问题?
static void Main(string[] args)
{
string srtins = "大家最近怎么样?";
byte[] bs = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("GB2312"),
Encoding.UTF8.GetBytes(srtins) );
string strUtf = Encoding.GetEncoding("GB2312").GetString(bs); bs = Encoding.Convert(Encoding.GetEncoding("GB2312"), Encoding.UTF8, bs);
string strRet= Encoding.UTF8.GetString(bs);
Console.WriteLine(strUtf); // 输出:大家最近怎么样?
Console.WriteLine(strRet); // 输出:大家最近怎么样?
}
在我的机器上绝对没有问题的。楼主的情况是怎么样的,说出来,分析分析。
第一个解码方式错了,不是UTF8,应该是GB2312。
Encoding.UTF8.GetBytes(srtins) );
而不是象你那样的
byte[] bs = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("GB2312"),
Encoding.UTF8.GetBytes(srtins) );吧.你这样的话相当于没有转换。最后string strRet= Encoding.UTF8.GetString(bs);得到的也不是UTF8格式的内码,而是字符串
string类型在.net内部都是以unicode存储的,没有什么gb字符串和utf字符串。
只有在需要的时候才需进行编码。
楼主对这些好像搞得不太明白。
楼主就说说想要做什么,我看看应该怎样解决。如果楼主只是想要一个字符串的UTF8编码,那
byte[] bs = Encoding.UTF8.GetBytes(srtins);
string ret = Encoding.UTF8.GetString(bs);
bs 中就是了,ret 中就是对相应编码进行解码后的字符串。
int len = DataReader.GetBytes(
i,
0,
bs,
0,
bs.Length
);
string s = Encoding.UTF8.GetString(bs, 0, len);试试看吧。
然后才能用GetBytes();
之后各个列必须按顺序访问。
试试看行不行。
当然也可能和mysql有关系,别的数据库可能就没有这个问题了,我用别的数据库试试看
我觉得你还是应该试试下面这个,问题的确不在存取。
可没别的办法可以解决了,只好把原始字节拿出来,再进行解码。dataReader = command.ExecuteReader(CommandBehavior.SequentialAccess);
byte[] bs = new byte[1024];
int len = dataReader.GetBytes(
i,
0,
bs,
0,
bs.Length
);
string s = Encoding.UTF8.GetString(bs, 0, len);
看样子没有办法了!
CultureInfo oldci = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = ci;string strUtf = DataReader.GetString(i);
string strRet = Encoding.UTF8.GetString(bs = Encoding.GetEncoding(1252).GetBytes(strUtf));Thread.CurrentThread.CurrentCulture = oldci;
CultureInfo oldci = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = ci;string strUtf = DataReader.GetString(i);
string strRet = Encoding.UTF8.GetString(Encoding.GetEncoding(1252).GetBytes(strUtf));Thread.CurrentThread.CurrentCulture = oldci;
问题似乎不在这里,但是我也不能确定问题到底是在哪里。这才是最要命的。不知道在mysql中数据是怎么存取的。
小弟在杭州,用vc编程4年,平日很少上msdn,因为很多问题都可以自己解决,今天一来很荣幸认识这位小兄弟,很想交你这个热心的朋友,到杭州来玩的时候别忘找我!
我知道问题在哪儿:
在mysql中,数据是以UTF8编码存放的,而你读到程序里的,却不是用UTF8解码的。
我原以为应该是用的 Thread.CurrentThread.CurrentCulture 中的信息进行解码的,在中文系统中,这里面的编码方式和 Encoding.Default 一样,是GB2312,可GB2312和UTF8之间互编是有损的,也就是你上面少了一个字的原因。
可恶的是我们没法控制 DataReader.GetString() 所用的编码方式,上面我就试着改 Thread.CurrentThread.CurrentCulture 中的信息。“en-us“用的是ASCII编码,可以和UTF8无损互编,可惜,你已经试过了,不行。
看来 DataReader.GetString() 用的是 Encoding.Default ,这个信息来自系统信息,程序改不了。
再一种想法就是读原始字节,用 dataReader.GetBytes,可惜,也不行。
程序这方面我是想不到什么招了,楼主还是看看数据库那边能有什么办法。
我的QQ:25738191