【问题标题】:Render special character C#渲染特殊字符 C#
【发布时间】:2019-06-05 11:41:10
【问题描述】:

我有一个包含 特殊字符 的字符串,例如:12345678912\rJ\u0011,因为我需要访问这些特殊字符来配置我的应用程序。我想在 TextBox 字段中完全像这样显示这个字符串,所以到目前为止我所做的一切都会导致一个字符串,其中字符 \u0011 尝试在末尾呈现一个空字符:"7896104866061\rJ"

我做了这个,但它不起作用。

string result = Regex.Replace(
    ToLiteral(this.Buffer), 
   "[^\x00-\x7Fd]", 
    c => string.Format("\\u{0:x4}", (int)c.Value[0]))
 .Replace(@"\", @"\\");

public static string ToLiteral(string input)
    {
        using (var writer = new StringWriter())
        {
            using (var provider = CodeDomProvider.CreateProvider("CSharp"))
            {
                provider.GenerateCodeFromExpression(
                    new CodePrimitiveExpression(input), 
                    writer, 
                    null);

                return writer.ToString();
            }
        }
    }

我需要做什么?提前致谢。

【问题讨论】:

  • 所以你想将:crtlchar 转换为字面意义上的\u0011?
  • 是的@Fabio!这正是我想做的。

标签: c# string winforms string-formatting


【解决方案1】:

在这里我的 sn-p 显示 ctrl 字符:https://gist.github.com/TheTrigger/6efa6a8e42eedf1e61e0db8e9ef4360a

using System.Text;

namespace CtrlCharReplace
{
    public static class Extensions
    {
        public static string ReplaceCtrl(this string s)
        {
            var sb = new StringBuilder();
            for (int i = 0; i < s.Length; i++)
            {
                char c = s[i];

                var isCtrl = char.IsControl(c);
                var n = char.ConvertToUtf32(s, i);

                if (isCtrl)
                {
                    sb.Append($"\\u{n:X4}");
                }
                else
                {
                    sb.Append(c);
                }
            }

            return sb.ToString();
        }
    }
}

【讨论】:

    【解决方案2】:

    在调用ToLiteral 之前将\ 替换为\\,您将获得所需的输出。

    string result = Regex.Replace(ToLiteral("12345678912\\rJ\\u0011".Replace(@"\", @"\\")), "[^\x00-\x7Fd]", c => string.Format("\\u{0:x4}", (int)c.Value[0]));
    

    【讨论】:

      【解决方案3】:

      让我们在一个循环构建字符串;我们有几类字符:

      1. 已知控件,如\n\t\r
      2. \u0011 等控件
      3. 应转义的字符:"\
      4. 应按原样放置的简单字符

      代码:

      using System.Linq;
      ...
      
      private static IReadOnlyDictionary<char, string> s_KnownControls = new 
        Dictionary<char, string>() {
          { '\0', "\\0"},
          { '\a', "\\a"},
          { '\b', "\\b"},
          { '\n', "\\n"},
          { '\v', "\\v"},
          { '\t', "\\t"},
          { '\f', "\\f"},
          { '\r', "\\r"},
        };
      
      public static string ToLiteral(string input) {
        if (null == input)
          return null;
      
        StringBuilder sb = new StringBuilder();
      
        foreach (var c in input) {
          if (char.IsControl(c))
            sb.Append(s_KnownControls.TryGetValue(c, out var s) 
              ? s 
              : $"\\u{((int)c):x4}");
          else {
            if (c == '"' || c == '\\') // escapement 
              sb.Append('\\'); 
      
            sb.Append(c);
          } 
        }
      
        return sb.ToString();  
      }
      

      演示:

        string[] tests = new string[] {
          "12345678912\rJ\u0011",
          "abc\tdef\t\0A\n\a\bB",
          "abc\"def\"xyz\\pqr"
        };
      
        string report = string.Join(Environment.NewLine, tests
          .Select(test => ToLiteral(test)));
      

      结果:

      12345678912\rJ\u0011
      abc\tdef\t\0A\n\a\bB
      abc\"def\"xyz\\pqr
      

      【讨论】:

        猜你喜欢
        • 2012-11-08
        • 2016-03-10
        • 2023-04-05
        • 1970-01-01
        • 2016-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-02
        相关资源
        最近更新 更多