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

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

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. SSH登陆验证绕过漏洞(cve-2018-10933)

    名称: SSH登陆验证绕过漏洞 CVE-ID: cve-2018-10933 EXPLOIT-DB: https://www.exploit-db.com/exploits/45638/ 平台: Li ...

  2. 【bug】—— H5页面在 ios 端滑动不流畅的问题

    IOS系统的惯性滑动效果非常6,但是当我们对div加overflow-y:auto;后是不会出这个效果的,滑动的时候会感觉很生涩.怎么办? 方案一: 在滚动容器内加-webkit-overflow-s ...

  3. Android中LayoutParams的用法

    简单说说 自己对 android LayoutParams的理解吧,xh写不出高级文章是低级写手.public static classViewGroup.LayoutParamsextends Ob ...

  4. IntelliJ IDEA中可以用Tab键跳出括号和引号吗?

    在 Settings->Editor->General->Smart Keys 中勾选 Jump outside closing bracket/quote with Tab 即可.

  5. python学习,day3:函数式编程,递归和高阶函数

    # coding=utf-8 # Author: RyAn Bi def calc(n): #递归 print(n) if int(n/2) > 0: #设置条件,否则会循环999 次,报错, ...

  6. 我也学习JAVA多线程-join

    在工作中,挺少遇到join关键字,但很多多线程资料和面试过程中,初中级开发工程师总会遇到join. 今天一起学习下join. join的作用:等待指定的时间(当为0时,一直等待),直到这个线程执行结束 ...

  7. BLE pairing vs. bonding

    differece between pairing and bonding .see

  8. (转)分布式中使用Redis实现Session共享(二)

    上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见的session开始,刚好也重新学习一遍session的实现原理.在阅读之前假设你已经会使用nginx+i ...

  9. JDBC处理可滚动的处理集

    Statement createStatement(int resultSetType,                           int resultSetConcurrency,     ...

  10. Ubuntu14.04下Cloudera安装搭建部署大数据集群(图文分五大步详解)(博主强烈推荐)(在线或离线)

    第一步: Cloudera Manager安装之Cloudera Manager安装前准备(Ubuntu14.04)(一) 第二步: Cloudera Manager安装之时间服务器和时间客户端(Ub ...