C# utf8转码最后一位乱码问题

flashwind9527 2014-01-09 03:45:27
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也就是?号
...全文
672 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
数据结构啊!大人
  • 打赏
  • 举报
回复
至于你说的“varchar类型的函数貌似只有getstring”,我猜它根本没有支持中文(或者其它几十种文字)的标准函数。如果你还是坚持使用这种数据库,还是好自为之吧。
  • 打赏
  • 举报
回复
引用 楼主 flashwind9527 的回复:
因为我读Firebird数据库就是utf8的,varchar类型的函数貌似只有getstring,读进来就是乱码,而转换后就存在了上面的问题,时常末位成了乱码,其实是byte最后一个字节被自动替换成了0x3f也就是?号
正如#2楼所写的,当你把utf8编码当作gb2312来读取,自然就会出现问题。你使用utf编码(然后写入Firebird的字段里),就要以utf8编码方式解码。 通常不会去使用 Encoding.Default。你要搞懂这是什么才去使用,不要仅仅望文生义地瞎猜这个 Default 的含义。
  • 打赏
  • 举报
回复
引用 3 楼 flashwind9527 的回复:
主要是我现在在Firebird数据库里只能通过自带的FbDataReader.GetString获得,获取后的就是乱码"鑻辨牸涓铰疯鍟?",所以我只能转换成byte[]然后再转码,不过转码后经常末位就变成乱码了
这跟#2楼跟你说的“编码解码应该真正一一对应”有什么冲突吗?你是不是没有理解#2楼呢? 如果#2楼的代码不是针对你的问题的,那么你问题中贴出来的四行代码是从那里抄袭来的?
hxhbluestar 2014-01-11
  • 打赏
  • 举报
回复
引用 楼主 flashwind9527 的回复:
byte[] utf8s1 = Encoding.UTF8.GetBytes("英格丽·褒啊"); 因为我读Firebird数据库就是utf8的,varchar类型的函数貌似只有getstring,读进来就是乱码,而转换后就存在了上面的问题,时常末位成了乱码,其实是byte最后一个字节被自动替换成了0x3f也就是?号
varchar不是对应UTF8编码格式,而是ANSI格式,也就是Encoding.Default,不同的操作系统会有不同的ANSI具体编码,可以使用nvarchar即Unicode编码来替代解决这个问题,这样你就不需要转码转来转去了
本拉灯 2014-01-09
  • 打赏
  • 举报
回复
System.Text.Encoding.Convert(Encoding srcEncoding, Encoding dstEncoding, byte[] bytes)用这个试吧
flashwind9527 2014-01-09
  • 打赏
  • 举报
回复
引用 2 楼 rtdb 的回复:
编码与解码要对应,这样才对: byte[] utf8s1 = Encoding.UTF8.GetBytes("英格丽·褒啊"); string aaa = Encoding.UTF8.GetString(utf8s1); byte[] utf8s2 = Encoding.Default.GetBytes(aaa); string s2 = Encoding.Default.GetString(utf8s2);
主要是我现在在Firebird数据库里只能通过自带的FbDataReader.GetString获得,获取后的就是乱码"鑻辨牸涓铰疯鍟?",所以我只能转换成byte[]然后再转码,不过转码后经常末位就变成乱码了
rtdb 2014-01-09
  • 打赏
  • 举报
回复
编码与解码要对应,这样才对: byte[] utf8s1 = Encoding.UTF8.GetBytes("英格丽·褒啊"); string aaa = Encoding.UTF8.GetString(utf8s1); byte[] utf8s2 = Encoding.Default.GetBytes(aaa); string s2 = Encoding.Default.GetString(utf8s2);
rtdb 2014-01-09
  • 打赏
  • 举报
回复
若是用Encoding.UTF8就一直用, 不要再用Encoding.Default.GetString 要用Encoding.UTF8.GetString

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧