【问题标题】:How to change all subscript characters in a string to normal in C#?如何在 C# 中将字符串中的所有下标字符更改为正常字符?
【发布时间】:2013-09-20 05:11:40
【问题描述】:

我对字符串中的下标字符有疑问。 假设我有以下字符串:O₂。

我希望该字符串的所有下标字符都是正常的,因此该字符串将如下所示: O2.(而不是 O₂)

我不知道如何在 C# 中做到这一点。

【问题讨论】:

  • 您不能用字符串存储这种格式。你是怎么储存这些的?是 FlowDocument 还是别的什么?
  • 它来自一个数据库,它存储在一个字符串属性中,string Name { get;放; }

标签: c# string character subscript


【解决方案1】:

.NET 中存在所有上标和下标字符的一般“分解”,如下所述:How to convert super- or subscript to normal text in C#

但是,如果您想手动执行操作,并且只需要下标中的数字 0-9,则可以在 U+2080 - U+2089 (http://en.wikipedia.org/wiki/Unicode_subscripts_and_superscripts) 中找到它们。

因此,您可以使用 unicode 字符的 C# 字符串表示 \uXXXX'0' 的 int 值来帮助您。

数字下标的字符“数字”值与普通书写数字的差异是:

(int) '\u2080' - (int) '0'

把它放在一起,下面可能会更好地解释它:

使用 System.IO; 使用系统;

class Program
{
    static void Main()
    {
       var subscriptValue = (int) '\u2080';
       var normalValue = (int) '0';
       var diff = subscriptValue - normalValue;
       Console.WriteLine("subscript value: {0}, normal value: {1}, difference: {2} ",
            subscriptValue, normalValue, diff);

       for (var i = normalValue; i <= (normalValue + 9); i++) {
           char normal = (char) i;
           char subscript = (char) (i + diff);
           Console.WriteLine("Normal: {0}, subscript: {1}", normal, subscript);
       }

    }
}

【讨论】:

    【解决方案2】:

    如果要转换标准 unicode 下标块([0x2080..0x209F] 符号) 您可以使用此代码:

    http://en.wikipedia.org/wiki/Unicode_subscripts_and_superscripts

        /// <summary>
        /// From subscript (standard subscript block [0x2080..0x209F] only) to normal
        /// </summary>
        public static String FromSubscript(String value) {
          if (String.IsNullOrEmpty(value))
            return value;
    
          Char[] Symbols = new Char[] { 
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', '?',  // <- '?' unknown/not standard symbols
            'a', 'e', 'o', 'x', '\u0259', 'h', 'k', 'l', 'm', 'n', 'p', 's', 't', '?', '?', '?' }; // <- u0259 - small latin shwa
    
          StringBuilder result = new StringBuilder(value.Length);
    
          foreach (Char ch in value) {
            int v = (int) ch;
    
            if ((v >= 0x2080) && (v <= 0x209F))
              result.Append(Symbols[v - 0x2080]);
            else
              result.Append(ch);
          }
    
          return result.ToString();
        }
    
      ... 
    
      String test = "O₂";
    
      Debug.Assert(String.Equals(FromSubscript(test), "O2", StringComparison.Ordinal));
    

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 2018-06-07
      相关资源
      最近更新 更多