显示不可打印的字符

时间:2013-10-21 14:44:28

标签: c# winforms codepages

我正在为自己的需要编写一个小小的十六进制查看器。陷入标准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属性后,它变为空字符串,并且不显示任何内容。

任何有关这方面的帮助都很可爱

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

1 个答案:

答案 0 :(得分:0)

我无法重现你的问题。

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

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使用以null结尾的字符串,这意味着零字节将被解释为字符串的结尾。所以以下程序失败了:

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);