日期:2014-05-17  浏览次数:20945 次

C# utf8转码最后一位乱码问题
            byte[] utf8s1 = Encoding.UTF8.GetBytes("英格丽·褒啊");
            string aaa = Encoding.Default.GetString(utf8s1);
            byte[] utf8s2 = Encoding.Default.GetBytes(aaa);
            string s2 = Encoding.UTF8.GetString(utf8s2);
将上面一段字符串转成byte[]没有问题,然后再转成默认编码的字符串aaa="鑻辨牸涓铰疯鍟?",后面utf8s2理论上应该是与utf8s1一致的,但现在是最后一位由0x8a变成了0x3f,也就是?,所以导致最后的s2末位变成了乱码。
测试了很多,有些末位没问题,有些就被?代替,这是为什么,有没有什么办法解决?
因为我读Firebird数据库就是utf8的,varchar类型的函数貌似只有getstring,读进来就是乱码,而转换后就存在了上面的问题,时常末位成了乱码,其实是byte最后一个字节被自动替换成了0x3f也就是?号

------解决方案--------------------
编码与解码要对应,这样才对:
            byte[] utf8s1 = Encoding.UTF8.GetBytes("英格丽·褒啊");
             string aaa = Encoding.UTF8.GetString(utf8s1);
             byte[] utf8s2 = Encoding.Default.GetBytes(aaa);
             string s2 = Encoding.Default.GetString(utf8s2);
------解决方案--------------------
至于你说的“varchar类型的函数貌似只有getstring”,我猜它根本没有支持中文(或者其它几十种文字)的标准函数。如果你还是坚持使用这种数据库,还是好自为之吧。