C# 中文编码 本帖最后由 qinguan0619 于 2011-11-15 16:10:22 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 现在都unicode了,还用gbk干嘛,建议用utf8或者utf16 Encoding.Default应该是可以处理中文的,出现什么样的错误? 开始一直用的就是Encoding.Default,在下面一句代码 Encoding.Default.GetBytes(this.MessageBody, 0, this.MessageLength - 10, buffer, 10);就碰了这个问题,不能处理中文,报错如下:未处理的异常: System.ArgumentOutOfRangeException: 索引和计数必须引用该字符串内的位置。参数名: s 在 System.Text.EncodingNLS.GetBytes(String s, Int32 charIndex, Int32 charCount, Byte[] bytes, Int32 byteIndex) Encoding.GetBytes的第三个参数是字符个数,用this.MessageLength - 10是完全错误的,应该是MessageBody的长度,如果MessageBody是string的话,应该这样:Encoding.Default.GetBytes(this.MessageBody, 0, MessageBody.Length, buffer, 10); MessageBody的确是string类型的,第三个参数也是字符的个数,即MessageBody的长度,MessageLength是buffer的长度,包括MessageBody以及其它一些头部信息,10是头部信息的长度,所以this.MessageLength - 10 = MessageBody.Length,应该是没有问题的。我换了个方式,把MessageBody类型由string改成了byte[] ,可以读中文了,费解 。 你看一下代码,this.MessageLength - 10 不等于 MessageBody.Length而是:this.MessageLength - 10 =Encoding.Default.GetByteCount(this.MessageBody)Encoding.Default.GetByteCount(this.MessageBody)是MessageBody编码后的长度,不等于MessageBody.Length,如果是utf7/utf8的话,英文字符数正好等于编码后的字节数,这只是巧合而已,因为在utf7下,一个英文字符只占用一个字节,但在utf7下,一个中文字符就会多于一个字节,所以中文会出错,你试过MessageBody.Length没有? 差点忘了结贴了,我把所有数据都存成byte类型,问题解决了。当时也不记得有没有试过MessageBody.Length,就是用string类型时老是碰到各种问题。 串口通信使用JustinIO.cs类遇到问题 LC.exe退出,代码-1怎么解决 关于Remoting的一个问题. C#程序在WIN2003下编译运行正常,在XP下安装后运行提示错误 在方法内建Form,响应不行........... 求一个开源的,开发论坛的工具 请问如何得到当前日期的下一个星期一? 反射问题 请教如何用C#取网卡MAC的地址?? winform编程,使用Geckofx当浏览器用,点击网页里的下载链接没有反映 类继承后不能采用父类的扩展方法? 在C#程序中调用C++的dll,DllImport
开始一直用的就是Encoding.Default,在下面一句代码
Encoding.Default.GetBytes(this.MessageBody, 0, this.MessageLength - 10, buffer, 10);
就碰了这个问题,不能处理中文,报错如下:
未处理的异常: System.ArgumentOutOfRangeException: 索引和计数必须引用该字符串内
的位置。
参数名: s
在 System.Text.EncodingNLS.GetBytes(String s, Int32 charIndex, Int32 charCoun
t, Byte[] bytes, Int32 byteIndex)
我换了个方式,把MessageBody类型由string改成了byte[] ,可以读中文了,费解 。
差点忘了结贴了,我把所有数据都存成byte类型,问题解决了。
当时也不记得有没有试过MessageBody.Length,就是用string类型时老是碰到各种问题。