在项目的实施过程中,类似化学分子式、平方、立方等,需要处理上、下标字符。

上下标字符的实现,大致有两种方式,一种是字符本身包含上下标信息,另一种方式是通过格式化标记实现上下标字符的显示。

Word中的上下标字符、HTML中的上下标字符,都是通过格式化标记实现的,即以m<SuperScript>2<SuperScript>此类方式存储,在显示的时候,根据标记显示上下标。此种方式灵活,可以将任意字符作为上下标,简单的可以理解为在四线格上写字,写在不同的位置上即可。

但该种方式存在一个问题,即格式的定义是一种契约,存储与显示必须遵循该契约,因此需要特定的编辑器和阅读器,简单的文本编辑器是不可以实现的。要使简单的文本编辑器可以实现上下标字符的编辑,则被编辑的字符本身需要带有上下标的信息,即需要将上下标信息进行字符编码。支持此类编码的字符集,Ascii自然是不行的,Unicode字符集对多数常用的上下标进行了编码实现。

使用Unicode编码实现上下标,需要相关的编辑器、阅读器、数据存储支持Unicode字符集,例如使用SqlServer存储过程处理信息时,可能存放上下标字符的变量应该定义为NVarchar而非Varchar。

以下辅助类实现Ascii字符到Unicode上、下标的转换,在实际应用中,可以通过定义一上、下标输入标记,然后对源字符串进行解析处理,实现字符串的上下标转换。例如,定义`为上标转义字符,^为下标转义字符,则H^2SO^4,m`3,通过识别对2、4进行下标处理,对3进行上标处理。

 using System;
using System.Collections.Generic;
using System.Text; namespace Eyuan.Common
{
/// <summary>
/// 上下标辅助类
/// </summary>
public static class SuperSubScriptHelper
{
/// <summary>
/// 转换为上标字符
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string ToSuperScriptStr(string str)
{
byte[] bytes = null;
bytes = SuperSubScriptHelper.ToSuperScript(str);
return Encoding.Unicode.GetString(bytes);
}
/// <summary>
/// 转换为上标
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static byte[] ToSuperScript(string str)
{
byte[] bytes = new byte[];
switch (str)
{
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x70);
break;
case "":
bytes[] = Convert.ToByte(0x00);
bytes[] = Convert.ToByte(0xB9);
break;
case "":
bytes[] = Convert.ToByte(0x00);
bytes[] = Convert.ToByte(0xB2);
break;
case "":
bytes[] = Convert.ToByte(0x00);
bytes[] = Convert.ToByte(0xB3);
break;
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x74);
break;
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x75);
break;
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x76);
break;
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x77);
break;
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x78);
break;
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x79);
break;
case "+":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x7A);
break;
case "-":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x7B);
break;
case "=":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x7C);
break;
case "(":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x7D);
break;
case ")":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x7E);
break;
case "n":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x7F);
break;
}
return bytes;
}
/// <summary>
/// 转换为下标字符
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string ToSubScriptStr(string str)
{
byte[] bytes =null;
bytes = SuperSubScriptHelper.ToSubScript(str);
return Encoding.Unicode.GetString(bytes);
}
/// <summary>
/// 转换为下标字节数组
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static byte[] ToSubScript(string str)
{
byte[] bytes = new byte[];
switch (str)
{
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x80);
break;
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x81);
break;
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x82);
break;
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x83);
break;
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x84);
break;
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x85);
break;
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x86);
break;
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x87);
break;
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x88);
break;
case "":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x89);
break;
case "+":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x8A);
break;
case "-":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x8B);
break;
case "=":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x8C);
break;
case "(":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x8D);
break;
case ")":
bytes[] = Convert.ToByte(0x20);
bytes[] = Convert.ToByte(0x8E);
break;
//case "n":
// bytes[1] = Convert.ToByte(0x20);
// bytes[0] = Convert.ToByte(0x8F);
// break;
}
return bytes;
}
}
}

SuperSubScriptHelper——Unicode上下标辅助类的更多相关文章

  1. HTML中的上下标标签的演示

    HTML中的上下标标签的演示 #table_head>td { font-weight: bold } tr { text-align: center } 作用 标签 演示代码 呈现效果 上标 ...

  2. LaTeX数学模式&上下标&代码块

    效果就是如上图所示了.学习了使用数学模式插入公式和使用上标和公式的编号.这里的目录没有展开,在编译一次目录会展开,代码块会被挤到下一页上面去. \documentclass[UTF8]{ctexart ...

  3. LaTeX常用篇(二)---上下标/分式/根式/求和/连乘/极限/积分/希腊字母

    目录 1. 序言 2. 上下标 3. 分式 4. 根式 5. 求和和连乘 6. 极限 7. 积分 8. 常用的希腊字母 9. 补充项 更新时间:2019.10.27 增加补充项中的内容 1. 序言   ...

  4. Excel上下标如何设置?

    Excel表格怎么设置上下标?Excel上下标设置技巧 在21世纪的我们,平时的工作和学习中,经常会使用到一些专业的文档,比如方程式.数据的公式和科学计数等,其中均会涉及到许多的上下标符号输入以及使用 ...

  5. Markdown 打出上下标

    1. 打上标,下标 2<sup>10</sup> <!--下标--> 2.同时打上下标 $x^p_ {ij}$ <!--上标为p,下标为ij,{}是用来组合i ...

  6. latex:公式的上下标

    1.行内公式的上下标 在行间公式中,例如\[\max_{i}\]的排版结果是 而在行内公式中,$max_{i}$的排版结果为 ,如果要使其仍在正下方,可插入字体尺寸档次命令 $\displaystyl ...

  7. matlab的特殊字符(上下标和希腊字母等)

    'T=25\circC',(摄氏度) 下标用 _(下划线) 上标用^ (尖号) 希腊字母等特殊字符用 α \alpha β \beta γ \gamma θ \theta Θ \Theta Г \Ga ...

  8. RDLC报表上下标实现

    例:m的6次方 ="M"&ChrW(8310) Character Name Character Num Entity Hex Entity Superscript Cha ...

  9. MathType中带上下标字符不对其

    如图,上面的好看,下面的就不好看的. 上面的图使用下图下面的形式,下面的图是用的是上面的形式. 如图可以看出,右侧的更好. 比如UiTVj这样的,需要分别都用下面的形式,不能UiT用上面的,Vj直接输 ...

随机推荐

  1. Python 各种编码相互转化 (目前只有Unicode utf-8)

    f='\u53eb\u6211' print f print(f.decode('unicode-escape'))

  2. [实战] 给现有的NGINX二进制RPM包加新模块

    [实战] 给现有的NGINX二进制RPM包加新模块 一.前言 在做 wiki 的镜像,这样以后文章就可以使用外链了(链接直接跳转墙内小站). 遇到的问题就是:我的 NGINX 包安装的时候图方便采用 ...

  3. 使用服务器上的Jupyter notebook。

    1.jupyter notebook --generate-config #产生配置文件 2.from notebook.auth import passwd #进入python环境,生成密码密文.第 ...

  4. asp.net c# 虾米音乐API

    最近用到虾米音乐的功能,主要是做一个分享音乐功能,找到好多代码,但是比较杂,有用的很少,因 此在此记录下,方便以后自己使用. 对于第三方网站,只要获取了唯一标识,基本上能抓取一些信息. 虾米 音乐的I ...

  5. P3292 [SCOI2016]幸运数字

    题目链接 题意分析 一句话题意 : 树上一条链中挑选出某些数 异或和最大 我们可以考虑维护一个树上倍增线性基 然后倍增的时候 维护一个线性基合并就可以了 写起来还是比较容易的 CODE: #inclu ...

  6. 链式二叉树的实现(Java)

    定义树节点: package 链式二叉树; public class TreeNode { private Object data; private TreeNode left; private Tr ...

  7. mysql工具——使用mysqlshow查看mysql对象信息,查看mysql表大小

    关键词:查看表大小,mysqlshow mysqlshow --count -uroot -p test

  8. 在 Go 语言中使用 Log 包--转自GCTT

    Linux 在许多方面相对于 Windows 来说都是独特的,在 Linux 中编写程序也不例外.标准输出,标准 err 和 null devices 的使用不仅是一个好主意,也是一个原则.如果您的程 ...

  9. appium安装与部署

    前提: ①:appium属于C/S架构,代码写在Client端 ②:本章所说的部署讲的是Android设备下的Appium安装与部署 ③:Appium Client的环境是针对python3的 App ...

  10. c语言中变量/函数命名以单下划线(_)和双下划线(__) 开头的意义

    以单下划线(_)表明是标准库的变量 双下划线(__) 开头表明是编译器的变量 建议自己在命名的时候不要用下划线开头,避免与标准库中的命名冲突 命名方法有好多,何必为自己找不自在呢.