【问题标题】:C# Create a subscript in a stringC#在字符串中创建下标
【发布时间】:2015-10-29 17:46:09
【问题描述】:

目前我正在尝试修复我的应用程序中的一些格式。我正在尝试为string 下标,并将其附加到普通的string 上——就像在 MS Word 中一样。我已经尝试过了(假设herehere):

string temp = "NormalText";
foreach( char t in "SubscriptedText".ToCharArray())
    temp += "\x208" + t;

MessageBox.Show(temp);

输出: NormalTextȈSȈuȈbȈsȈcȈrȈiȈpȈtȈeȈdȈTȈeȈxȈt

但是,正如我后来指出的,字体必须支持 unicode 定义。而且在互联网上似乎没有一种字体支持所有字母格式。

那么,有没有办法格式化我的文本以便下标它的后半部分?也许我缺少一个简单的功能?或者这是不可能的,我必须自己对齐我的下标文本?

编辑 也试过这个:

string temp = "NormalText";
foreach( char t in "SubscriptedText".ToCharArray())
    temp += "\x208" + (int)t;

MessageBox.Show(temp);

但是(当然)这根本行不通。我的输出如下所示:

NormalTextȈ84Ȉ105Ȉ101Ȉ102Ȉ101Ȉ114Ȉ84Ȉ101Ȉ120Ȉ11

【问题讨论】:

  • C# 中的字符串没有下标或上标。这对于显示字符串的任何内容都是一个问题(MessageBox 不会这样做)。在 unicode 块中存在有限的上标和下标字符子集,但没有通用方法可以在字符串上标或下标中生成任意字符块。
  • 如果您想要一个可以处理子脚本和超级脚本的MessageBox,那么您需要创建自己的,例如,可以显示富文本或 HTML 或您自己的某种格式。
  • 顺便说一句,您在代码中所做的是将西里尔大写字母 yi 添加到您的字符串中。您误解了维基百科页面告诉您的内容。例如,\x2081 会给你一个下标1,但它并没有告诉你在一个字符之前添加\x208 会成为下一个字符的下标。
  • 看起来你有 Unicode 字符(16 位宽)。您需要使用编码转换为字符串。字节[] 输入;字符串输出 = Encoding.Unicode.GetString(input);在不使用编码的情况下将数据转换为字符串后,您无法解决此问题。 Unicode 数据是一个和两个字节字符的混合。字符串/字符是两个字节,具有一个私有属性,指示每个字符是一个字节还是两个字节。一旦数据被错误地转换为字符串,就不可能在字符串格式中修复一个字符和两个字符数据的对齐方式。
  • This 如果您使用WPF 可能会有所帮助

标签: c# string subscript


【解决方案1】:

首先,可用于订阅的符号数量有限。有这些符号:

1 - '\u2081'
2-  '\u2082'
3-  '\u2083'
...
9 - '\u2089'
+ - '\u208A'
- - '\u208B'
= - '\u208C'
( - '\u208D'
) - '\u208E'

就是这样。所以你不能像“SubscriptedText”这样的字符串下标。

如果您想转换为订阅某些数字或允许的符号,您可以尝试以下方式:

void ShowSubText()
    {
        String inputString = "NormalText";
        var nonDigitSymbolsTable = new Dictionary<char, char>();
        nonDigitSymbolsTable.Add('+', 'A');
        nonDigitSymbolsTable.Add('-', 'B');
        nonDigitSymbolsTable.Add('=', 'C');
        nonDigitSymbolsTable.Add('(', 'D');
        nonDigitSymbolsTable.Add(')', 'E');
        StringBuilder temp = new StringBuilder();
        int checkToDigit = 0;
        foreach (char t in "1234567890+-=()".ToCharArray())
        {
            if (int.TryParse(t.ToString(), out checkToDigit))
                temp.Append("\\u208" + t);
            else
                temp.Append("\\u208" + nonDigitSymbolsTable[t]);
        }

        MessageBox.Show(inputString + GetStringFromUnicodeSymbols(temp.ToString()));
    }
    string GetStringFromUnicodeSymbols(string unicodeString)
    {
        var stringBuilder = new StringBuilder();
        foreach (Match match in Regex.Matches(unicodeString, @"\\u(?<Value>[a-zA-Z0-9]{4})"))
        {
            stringBuilder.AppendFormat(@"{0}",
                                       (Char)int.Parse(match.Groups["Value"].Value,System.Globalization.NumberStyles.HexNumber));
        }

        return stringBuilder.ToString();
    }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多