【问题标题】:Removing non Printable values aftert Encoding.ASCII.GetString()在 Encoding.ASCII.GetString() 之后删除不可打印的值
【发布时间】:2011-06-02 08:02:19
【问题描述】:

假设我有一个字节数组,我使用Encoding.ASCII.GetString() 将字节转换为字符串。现在前几个字节将包含实际值,但其余的都将具有 0 的值。获取字符串后,当我在 WPF 表单上显示它时,有一些不可打印的字符。如何删除这些不可打印的字符。一种方法是遍历数组并只考虑不包含 0 的索引,但我也可以使用 Unicode 编码,即Encoding.Unicode.GetString()。

解决问题的最通用方法是什么。

【问题讨论】:

  • 你知道Byte数组的实际编码吗?我想象输入数组是中文的,比如UTF8编码。
  • @tofutim:是的,我知道正在使用的实际编码,但正如我所提到的,它会因场景而异。
  • 您是否为编码未知而选择 ASCII 提供保险?从外语转换可能会导致钻石和心形等。你的意思是去掉那些奇怪的 ASCII 非字符,比如哔哔声吗?换行和制表符怎么样?
  • @tofutim:没有换行符和制表符。它将是一些字符,字节数组的其余部分将为零。如果只是 ASCII 编码,我只会寻找第一个零。

标签: c# string encoding byte non-printing-characters


【解决方案1】:
var buffer = new byte[] { 65, 66, 67, 68, 0, 0, 0, 0, 0 };
var length = buffer.TakeWhile(b => b != 0).Count();
var text = Encoding.UTF8.GetString(buffer, 0, length);

【讨论】:

  • 如果有一个字符的第一个字节为0怎么办?
  • 在 UTF-8(和 ASCII 也是)中,零字节绝不是字符的一部分。它可以安全地用作字符串终止符。
  • 谢谢,只有一个注释是在 Visual Studio 2008 中定义的 TakeWhile?
  • 是的。 TakeWhile 位于 .NET 3.5 的 System.Linq 命名空间中。
  • (1) 在类文件的顶部添加“使用 System.Linq”。 (2) 在项目设置中检查您的 .NET Framework 版本是否为 3.5 或更高版本。 (3) 在 Project References 中确保出现“System.Core”。
【解决方案2】:

我会在数组中找到第一个零,然后去掉后面的所有内容。

【讨论】:

    猜你喜欢
    • 2015-07-22
    • 1970-01-01
    • 2020-01-15
    • 2016-05-12
    • 1970-01-01
    • 2013-03-09
    • 2013-01-18
    • 1970-01-01
    相关资源
    最近更新 更多