【问题标题】:display unprintable characters显示不可打印的字符
【发布时间】:2013-10-22 16:21:14
【问题描述】:

我正在为自己的需要编写一个小型十六进制查看器。陷入标准 Label 控件不会在字符串中显示不可打印字符的情况:

public string ToASCIIstring(int numColumns)
{
    string ret = String.Empty;
    int stringBegin = 0;

    for (int i = 0; i < Data.Length; i++)
    {
        int colNum = i % numColumns;

        if ((colNum + 1 == numColumns) || (i == Data.Length -1 ))
        {
            ret += Encoding.ASCII.GetString(Data, stringBegin, colNum);
            stringBegin = i + 1;
            ret += "\n";
        }
    }

    return ret;
}

此方法返回正确的 ASCII 字符串,但在将其分配给 Label.Text 属性后,它变成了一个空字符串,没有任何显示。

任何帮助都会很可爱

附:我知道代码很糟糕,但它永远不会看到生产,它只是我自己的分析工具

【问题讨论】:

  • 好吧,不可打印的字符是……不可打印的。像 ASCII 7 这样的东西真的没有字形来表示它们。尝试显示一个“。”而是。
  • 请尝试 Encoding.Unicode.GetString... 。还可以尝试将一些硬编码文本设置为 tghe 标签,也许它只是在后台
  • 如果要显示十六进制,则必须将字节实际转换为十六进制。使用 BitConverter.ToString()。您会在 this answer 中找到同时执行这两种操作的示例代码。
  • 看起来你知道那个 ASCII 字符串 是什么,你能试着在这里显示那个 ASCII 字符串 或者至少显示它的 ASCII 码 让我们试试?
  • @KrisVandermotten 好吧,我可以手动检查不可打印的字符并用一些符号替换它们。这是我对此的第一个想法。事情可能不是事情应该如何工作 - 我可以在调试器中看到字符串并将其打印到控制台(它会发出哔哔声,但仍然会打印它) - 但我不能将它分配给标签。这很奇怪——它基本上是一个 CLR 字符串,所以无论里面有什么,Label 都应该能够打印它

标签: c# winforms codepages


【解决方案1】:

我无法重现你的问题。

我使用 .NET Framework 4.5 创建了一个新的 Windows 窗体应用程序,并在窗体上放置了一个标签。然后我有以下代码:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    string s = ((char)7).ToString();

    this.label1.Text = s;

    Debug.Assert(this.label1.Text == s);
}

正如预期的那样,它运行得很好。使用默认字体,这会显示一个细的项目符号。

我的猜测是出现了与不可打印的 ASCII 字符无关的其他问题。

更新:但是,标签后面的 Windows API 使用以空字符结尾的字符串,这意味着零字节将被解释为字符串的结尾。所以下面的程序失败了:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    var bytes = new byte[] { 7, 0, 0x6c, 0 };

    string s = Encoding.ASCII.GetString(bytes);

    this.label1.Text = s;

    Debug.Assert(this.label1.Text == s);
}

赋值后,Label.Text属性包含一个长度为1的字符串,只包含ASCII码为7的字符。

但这有效:

    var bytes = new byte[] { 7, 0, 0x6c, 0 };

    string s = Encoding.ASCII.GetString(bytes).Replace((char)0, '.');

    this.label1.Text = s;

    Debug.Assert(this.label1.Text == s);

【讨论】:

  • 没错,(char)7 对我来说也很好用。现在尝试这样做: byte[] arr = new byte[] { 7, 0, 0x6c, 0 }; //例如 this.label1.Text = Encoding.ASCII.GetString(arr,0,arr.Length);可能是因为 \0 字符...
  • 是的,我得到了相同的结果。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
相关资源
最近更新 更多