在WPF控件中显示特殊(不可打印)字符

时间:2010-07-16 16:05:36

标签: c# wpf special-characters

我有从设备收到的原始二进制数据。我想显示像HEX编辑器那样的数据 - 显示十六进制值,但也显示相应的字符。

我发现字体中包含ASCII代码为0 - 32的字符,但我无法将它们显示在屏幕上。

我尝试使用WPF listbox,itemscontrol和textbox。

是否有一些设置可以使这项工作?
或者也许某些WPF控件会显示这些字符?

修改
经过一些思考和测试后,只有出现问题的字符是换行,换页,回车,退格,水平和垂直制表符。作为快速解决方案,我决定用ASCII 16(10HEX)字符替换这些字符。我用ASCII,UTF-8和Unicode文件测试了它,它适用于这三种格式。

这是我正在使用的正则表达式:

rawLine = Regex.Replace(inputLine, "[\t\n\r\f\b\v]", '\x0010'.ToString());

它用一些四四方位的符号替换了这6个有问题的字符的所有出现。它表明这不是“常规可打印”字符,它对我有用。

2 个答案:

答案 0 :(得分:3)

不确定这是否是您想要的,但我建议您查看#develop项目。他们的编辑器可以显示空格,制表符和行尾标记。

我快速浏览了源代码,在ICSharpCode.AvalonEdit.RenderingSingleCharacterElementGenerator类中,似乎做了你想做的事。

答案 1 :(得分:0)

这应该可以帮助您扩展它

    private static string GetPrintableCharacter(char character)
    {
        switch (character)
        {
            case '\a':
            {
                return "\\a";
            }
            case '\b':
            {
                return "\\b";
            }
            case '\t':
            {
                return "\\t";
            }
            case '\n':
            {
                return "\\n";
            }
            case '\v':
            {
                return "\\v";
            }
            case '\f':
            {
                return "\\f";
            }
            case '\r':
            {
                return "\\r";
            }
            default:
            {
                if (character == ' ')
                {
                    break;
                }
                else
                {
                    throw new InvalidArgumentException(Resources.NOTSUPPORTCHAR, new object[] { character });
                }
            }
        }
        return "\\x20";
    }

    public static string GetPrintableText(string text)
    {
        StringBuilder stringBuilder = new StringBuilder(1024);
        if (text == null)
        {
            return "[~NULL~]";
        }
        if (text.Length == 0)
        {
            return "[~EMPTY~]";
        }
        stringBuilder.Remove(0, stringBuilder.Length);
        int num = 0;
        for (int i = 0; i < text.Length; i++)
        {
            if (text[i] == '\a' || text[i] == '\b' || text[i] == '\f' || text[i] == '\v' || text[i] == '\t' || text[i] == '\n' || text[i] == '\r' || text[i] == ' ')
            {
                num += 3;
            }
        }
        int length = text.Length + num;
        if (stringBuilder.Capacity < length)
        {
            stringBuilder = new StringBuilder(length);
        }
        string str = text;
        for (int j = 0; j < str.Length; j++)
        {
            char chr = str[j];
            if (chr > ' ')
            {
                stringBuilder.Append(chr);
            }
            else
            {
                stringBuilder.Append(StringHelper.GetPrintableCharacter(chr));
            }
        }
        return stringBuilder.ToString();
    }