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

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

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. [转] Foobar2000 DSP音效外挂元件-Part4

    [转] Foobar2000 DSP音效外挂元件-Part4 在第1部分的文章里主要介绍了foobar2000预设的DSP音效调整,这些则示要介绍几个比较会用到的DSP外挂元件,在foobar2000 ...

  2. Ionic2 启动加载优化总结

    1. ionic2通过ionic serve生成的main.js大于4M,必须先build才能部署 npm run ionic:build --prod 之后main.js缩小为大概100K+ 2. ...

  3. 利用python 学习数据分析 (学习三)

    内容学习自: Python for Data Analysis, 2nd Edition         就是这本 纯英文学的很累,对不对取决于百度翻译了 前情提要: 各种方法贴: https://w ...

  4. 总结day5 ---- ,字典的学习,增删改查,以及字典的嵌套, 赋值运算

    内容大纲: 一:字典的定义 二:字典的增加 >1:按照key增加,  无则增加,有则覆盖 >2:setdefault()  ,无则增加,有则不变 三:字典的删除 >1:pop()  ...

  5. IDEA自动生成TestNG的testng.xml的插件

    某地方见到的,自己实际操作一遍,记录一下.方便以后查询. 下载Create TestNG XML 插件,重启IDEA即可. 重启idea,新建Maven项目. pom.xml增加依赖 <depe ...

  6. PHP中引入文件的四种方式详解

    四种语句 PHP中有四个加载文件的语句:include.require.include_once.require_once. 基本语法 require:require函数一般放在PHP脚本的最前面,P ...

  7. 任务调度SpringTask

    一.什么是任务调度 在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作.常见的任务调度框架有Quartz和Spri ...

  8. Service Discovery protocol(SDP)

    locating services provided by Volume 3 , Part C , section 8 2.1sdp client-server architecture 2.2 se ...

  9. order by关键字

    作用:用于对查询结果进行排序 select * from emp where deptno = 20 order by sal 1.如何决定升序还是降序 默认排序:升序:select * from e ...

  10. Openerp 修改 tree view 的列宽

    在 tree 的后边添加自定义css 列:“my_class" 然后在对应的css文件中,添加样式: 保存,重新刷新页面即可.