首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

GB2312转UTF-8后不可逆?该如何解决

2013-01-08 
GB2312转UTF-8后不可逆?如题,我做了两个将编码在utf-8和gb2312间转换的按钮,代码如下。但发现将textbox1中

GB2312转UTF-8后不可逆?
如题,我做了两个将编码在utf-8和gb2312间转换的按钮,代码如下。但发现将textbox1中的中文utf-8转为gb2312再转回,大部分是可以转回的(部分文字会变成??这样)。但如果先gb2312转为utf-8再转回的话就完全是乱码了,想了半天不知道为什么会这样,求解……


'gb2312转utf8
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        TextBox1.Text = Encoding.GetEncoding("utf-8").GetString(Encoding.GetEncoding("gb2312").GetBytes(TextBox1.Text))
    End Sub
'utf-8转gb2312
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        TextBox1.Text = Encoding.GetEncoding("gb2312").GetString(Encoding.GetEncoding("utf-8").GetBytes(TextBox1.Text))
    End Sub

[解决办法]
我的意思是说字符串已经没有Unicode这个概念了,字符串是由char类型组合,这个Unicode只是内部实现,换一个实现不会受影响。

就像上面的情况,一个错误的字节序列用uft-8编码返回字符串的时候,系统并没有按照编码规范转换为Unicode,而是对于没有定义的序列都用239,191,189这三个字节来表示,丢失了信息。

[解决办法]
当你写
txt = Encoding.UF8.GetString(byteVar)
的时候,你是把byteVar中的字节数组按照utf8规则逐字解析为unicode字符串(因为只有这样系统才能正确显示处理,因为现在的windows以及vs等都是基于unicode的)。

如果你把 txt 的值说成了什么“utf8字符串”那可就完全错误了。

热点排行