【问题标题】:How do I convert a byte array to a string如何将字节数组转换为字符串
【发布时间】:2009-03-31 05:03:01
【问题描述】:

我有一个从 FileStream.Read 返回的字节数组,我想把它变成一个字符串。我不能 100% 确定编码 - 它只是我保存到磁盘的一个文件 - 我该如何进行转换?是否有一个 .NET 类可以读取字节顺序标记并为我找出编码?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    how-to-guess-the-encoding-of-a-file-with-no-bom-in-net

    由于字符串是 Unicode,您必须在转换时指定编码。文本流(甚至 ReadAllText() )内部有一个活动编码,通常是一些合理的默认值。

    【讨论】:

      【解决方案2】:

      如果File.ReadAllText 可以正确读取文件,那么您有几个选择。

      您可以异步调用File.ReadAllText,而不是调用BeginRead

          delegate string AsyncMethodCaller(string fname);
      
          static void Main(string[] args)
          {
              string InputFilename = "testo.txt";
              AsyncMethodCaller caller = File.ReadAllText;
              IAsyncResult rslt = caller.BeginInvoke(InputFilename, null, null);
      
              // do other work ...
      
              string fileContents = caller.EndInvoke(rslt);
          }
      

      或者您可以从字节数组创建一个MemoryStream,然后在其上使用StreamReader

      【讨论】:

        【解决方案3】:

        试试这样的:

        buffer = Encoding.Convert( Encoding.GetEncoding("iso-8859-1"), Encoding.UTF8, buffer );
        newString = Encoding.UTF8.GetString( buffer, 0, len );
        

        【讨论】:

        • 为什么这比首先使用 Encoding.GetEncoding("iso-8859-1").GetString(...) 更好?关键是OP不知道编码是什么。
        【解决方案4】:

        您对文件了解多少?真的可以是 any 编码吗?如果是这样,您需要使用启发式方法来猜测编码。如果是 UTF-8、UTF-16 或 UTF-32,那么

        new StreamReader(new MemoryStream(bytes), true)
        

        会自动为您检测编码。如果您真的不知道编码,则文本非常讨厌。在很多情况下,您真的只是在猜测。

        【讨论】:

          【解决方案5】:

          没有简单的方法来获取编码,但如上所述使用

          string str = System.Text.Encoding.Default.GetString(mybytearray);
          

          如果您不知道编码是什么。如果您在欧洲,ISO-8859-1 可能就是您拥有的编码。

          string str = System.Text.Encoding.GetEncoding("ISO-8859-1").GetString(mybytearray);
          

          【讨论】:

            【解决方案6】:

            System.IO.File.ReadAllText 做你想做的事。

            【讨论】:

            • 如果可以的话,我会这样做,但不幸的是,我需要使用 BeginRead 方法进行异步操作,该方法只返回一个字节数组...
            • 那么公平。在这种情况下,jon skeet 在下面(或现在,可能是上面)的答案是好的。
            • ReadAllText 也采用 UTF-8。
            • MSDN for readalltext 声明它自动检测:“此方法尝试根据字节顺序标记的存在自动检测文件的编码。编码格式为 UTF-8 和 UTF-32(大-endian 和 little-endian) 可以被检测到。”
            猜你喜欢
            • 2013-05-08
            • 2015-08-13
            • 1970-01-01
            • 2022-01-23
            • 2021-11-11
            • 1970-01-01
            相关资源
            最近更新 更多