C# 如何将byte[]用正确字符编码转为字符串?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 如何将byte[]用正确字符编码转为字符串?相关的知识,希望对你有一定的参考价值。

我要写一个Function:
/// <summary>
/// 将输入的byte[]转换为正确的字符串。
/// </summary>
/// <param name="bBuffer">文本字符串byte[]数据</param>
/// <returns>输出正确的文本字符串</returns>
public static string Convert(byte[] bBuffer)

//判断bBuffer是什麼编码的文本
//bBuffer可能是GB2312/BIG5/UTF8/Unicode/ASCII/......等等编码文本的byte[]数据,如何得知bBuffer的正确编码?

return Encoding.GetEncoding(正确编码).GetString(bb);

return Encoding.GetEncoding(正确编码).GetString(bBuffer);

byte[] 是无法区分编码的,那是存入数据时要注意的事情,而不是读取的时候!
即你用什么码存进去的就应该用什么码取出来

能不能换个思路:
把编码方式也存入byte[]数组的头部,跟数据一起传递过来,
在获取的时候再截取头部信息,然后再按照具体的编码进行转换追问

由於需求中无法控制和得知byte[]数据的原编码。
可否枚举目前所有的编码?每一种编码都转换一次,看看哪一个正确?

追答

可以实现所要的功能

追问

可否提供目前所有的编码?(或在哪里有这些资料?)
如何判断是否正确?

参考技术A 无法得知,因为字节流本身没有包含任何编码信息,只有文件头才有标明编码.
最多只能分析不同编码的字节流有一些有规则的特征码但不足以作为识别编码方式,而且代价也太大!追问

由於需求中无法控制和得知byte[]数据的原编码。
可否枚举目前所有的编码?每一种编码都转换一次,看看哪一个正确?

追答

这个倒还不至于用这么苯的方法。从字节流编码推断 编码的方法网上有,我找到一个类库可以用,对于 特殊字符串(比如经典的“联通” 记事本乱码现象)无能为力,不过大部分情况下不会影响使用。
using NChardet;

public static string GetCharset(byte[] buffer)

Detector det = new Detector(PSMDetector.ALL);
MyCharsetDetectionObserver cdo = new MyCharsetDetectionObserver();
det.Init(cdo);
byte[] buf = new byte[1024];
int index = 0;
bool done = false;
bool isAscii = true;
while (index < buffer.Length)

buf = buffer.Skip(index).Take(1024).ToArray();
if (isAscii)
isAscii = det.isAscii(buf, buf.Length);
if (!isAscii && !done)
done = det.DoIt(buf, buf.Length, false);
index += 1024;

det.DataEnd();
if (isAscii)

return "ASCII";

else if (cdo.Charset != null)

return cdo.Charset;

return "Unknow";

你留下邮箱,我把 dll发给你

追问

dino_f@21cn.com
Very thank you

追答

已发送。
另外少写了一个类:
public class MyCharsetDetectionObserver : NChardet.ICharsetDetectionObserver

public string Charset = null;
public void Notify(string charset)

Charset = charset;

本回答被提问者采纳

求问 C#如何将json字符串转为datatable 求详细解答

没必要转为datatable啊,可以转为List,定义一个实体类用newtonsoft.json转, datatable其实大多用于数据库出来的数据,一般情况用不到的,非要转为datatable也可以,new一个datatable出来,循环json里面的每一条数据,一条一条加进datatable集 参考技术A 需要引用newtonsoft.json这个dll吧,用这个解析json字符串 参考技术B //序列化
json = Newtonsoft.Json.JsonConvert.SerializeObject(dt);
//反序列化
dt = Newtonsoft.Json.JsonConvert.DeserializeObject(list, typeof(DataTable)) as DataTable;

以上是关于C# 如何将byte[]用正确字符编码转为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

C#中string转二进制一定要先编码吗?byte[] byteArr = Encoding.Default.GetBytes(str);

C#中如何将byte[]转化为字符串!!!

java字符编码

c#怎么把byte数组转换为字符串

java中如何计算一个字符串的byte长度(一个汉字多少字符)

java 如何将string src = "ff" 转为 byte[] bt = (byte)0xff