none
如何自动检测 一个 (文本)Stream 的 编码? RRS feed

  • 问题

  • 在 classic asp 里面 可以用 Adodb.Stream 来自动转换编码

    而到了 C# 里面, 却没有这么好用的东西!

    请问如何 在 C#使用 Adodb.Stream ? 或者 其他拥有自动检测编码的方法?

    2015年8月17日 2:28

全部回复

  • 你好,

    你是想检测文本文件的编码格式吗?如果是的话StreamReader有提供类似的方法,请尝试下面的例子。

    using (FileStream fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + "\\hello.txt", FileMode.OpenOrCreate, FileAccess.Read))
                using (StreamReader sr = new StreamReader(fs))
                Console.WriteLine(sr.CurrentEncoding.EncodingName);


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年8月18日 2:32
  • 我发现用 streamReader 读  httpWebResponse.getResponseStream() 的 流 时  如果是 GB2312 就会乱码
    2015年8月18日 5:26
  • 你好 john,

    HttpWebResponse类型包含ContentEncoding属性,可以获取响应流的编码格式。

    https://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.contentencoding(v=vs.110).aspx


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年8月18日 6:46
  • 这个不好用, 我用那个 ContentEncoding 获取到的 string.Empty , 而且似乎需要设置 Response.Chaset 后才会有, 而使用用 HttpwebResposne.CharacterSet  却不正确(解码时乱码)

    难道就没有什么好方法来确定一个 文本流的编码么?

    2015年8月18日 7:59
  • 能上传一个例子吗,我来看看。先上传到你的OneDrive然后共享一个share link到这里。

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2015年8月19日 7:41
  • 貌似没有很好的解决办法,我之前找到一个方法,但也是使用遍历加特殊字符出现的几率然后判断的。在生产环境中也经常出现问题。最后的解决方案是要求全部UTF-8或者先用utf-8转成base64再用其它的非utf-32形式传送,然后反解,基本没有问题。StreamReader取字符编码应该取出的是StreamReader正在用哪种编码读取stream而非stream真实使用的编码。因为如果你不给StreamReader传Encoding的值,它总要有一个默认,我们取到的应该就是它的默认。
    2015年8月19日 9:40
  •         public string getContent()
            {
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(lookUrl);
                HttpWebResponse Response = (HttpWebResponse)webRequest.GetResponse();
                Stream ResponseStream = Response.GetResponseStream();
                string Result = "";
    
                using (var reader = new StreamReader(ResponseStream, Encoding.UTF8))
                {
                    Result = reader.ReadToEnd();
                }
    
                return Result;
            }
    我要从某个网页获取 string 的结果,但是如何获取到 StreamRader 所需的Encoding ?
    2015年8月21日 3:26
  • private MemoryStream ContentStream { get; set; }
            public string getContent()
            {
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(lookUrl);
                HttpWebResponse Response = (HttpWebResponse)webRequest.GetResponse();
                this.ContentStream = new MemoryStream();
                Response.GetResponseStream().CopyTo(this.ContentStream);
                this.ContentStream.Position = 0;
                string Result = "";
    
                this.EnCod = FindWebResponseEncoding(Response,ContentStream);
    
    
                using (var reader = new StreamReader(this.ContentStream,this.EnCod))
                {
                    this.ContentStream.Position = 0;
                    Result = reader.ReadToEnd();
                }
    
                return Result;
            }
    
            private Encoding FindWebResponseEncoding(HttpWebResponse webResponse,Stream HtmlStream)
            {
                String EncodingName = "";
                string ContentType = webResponse.ContentType;
                if (ContentType.IndexOf("Charset",StringComparison.OrdinalIgnoreCase) > 0)
                {
                    // 如果ContentType 包含 Charset 则 使用 webResponse中的 CharacterSet;
                    EncodingName = webResponse.CharacterSet;
                }
                else
                {
                    // 如果不包含则提取 Html里面的charset定义
    
    
                    // 避免在此函数里面读取 ResponseStrem 后无法再读取的问题,特意 复制一份
                    MemoryStream TempStream = new MemoryStream();
                    HtmlStream.CopyTo(TempStream);
    
                    using (var reader = new StreamReader(TempStream))
                    {
                        TempStream.Position = 0;
                        string Temp = reader.ReadToEnd();
                        Match match = Regex.Match(Temp,@"<meta [^<]*\bcharset[\s]*=[\s]*(\""){0,1}" + @"([a-zA-z0-9\-]+)" + @";{0,1}\""{0,1}[^<]*>",RegexOptions.IgnoreCase|RegexOptions.Multiline);
                        EncodingName = match.Groups[2].Value.Trim();
                    }
                }
                try{
                    return Encoding.GetEncoding(EncodingName);
                }
                catch
                {
                    return Encoding.UTF8;
                }
    
            }
        }
    我修改了代码,对于没有在 contentType设置Charset的网页,手动进行查找HTML检索, 但在实现的过程中,发现如果一个 流被 StreamReader读取后,它的 canRead canSeek canWrite 全部变成 false, (你会发现我在上面代码中 创建了好几个 MemoryStream),请问 Stream不能重复读取么?
    2015年8月22日 3:04