SuperSubScriptHelper——Unicode上下标辅助类
在项目的实施过程中,类似化学分子式、平方、立方等,需要处理上、下标字符。
上下标字符的实现,大致有两种方式,一种是字符本身包含上下标信息,另一种方式是通过格式化标记实现上下标字符的显示。
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上下标辅助类的更多相关文章
- HTML中的上下标标签的演示
HTML中的上下标标签的演示 #table_head>td { font-weight: bold } tr { text-align: center } 作用 标签 演示代码 呈现效果 上标 ...
- LaTeX数学模式&上下标&代码块
效果就是如上图所示了.学习了使用数学模式插入公式和使用上标和公式的编号.这里的目录没有展开,在编译一次目录会展开,代码块会被挤到下一页上面去. \documentclass[UTF8]{ctexart ...
- LaTeX常用篇(二)---上下标/分式/根式/求和/连乘/极限/积分/希腊字母
目录 1. 序言 2. 上下标 3. 分式 4. 根式 5. 求和和连乘 6. 极限 7. 积分 8. 常用的希腊字母 9. 补充项 更新时间:2019.10.27 增加补充项中的内容 1. 序言 ...
- Excel上下标如何设置?
Excel表格怎么设置上下标?Excel上下标设置技巧 在21世纪的我们,平时的工作和学习中,经常会使用到一些专业的文档,比如方程式.数据的公式和科学计数等,其中均会涉及到许多的上下标符号输入以及使用 ...
- Markdown 打出上下标
1. 打上标,下标 2<sup>10</sup> <!--下标--> 2.同时打上下标 $x^p_ {ij}$ <!--上标为p,下标为ij,{}是用来组合i ...
- latex:公式的上下标
1.行内公式的上下标 在行间公式中,例如\[\max_{i}\]的排版结果是 而在行内公式中,$max_{i}$的排版结果为 ,如果要使其仍在正下方,可插入字体尺寸档次命令 $\displaystyl ...
- matlab的特殊字符(上下标和希腊字母等)
'T=25\circC',(摄氏度) 下标用 _(下划线) 上标用^ (尖号) 希腊字母等特殊字符用 α \alpha β \beta γ \gamma θ \theta Θ \Theta Г \Ga ...
- RDLC报表上下标实现
例:m的6次方 ="M"&ChrW(8310) Character Name Character Num Entity Hex Entity Superscript Cha ...
- MathType中带上下标字符不对其
如图,上面的好看,下面的就不好看的. 上面的图使用下图下面的形式,下面的图是用的是上面的形式. 如图可以看出,右侧的更好. 比如UiTVj这样的,需要分别都用下面的形式,不能UiT用上面的,Vj直接输 ...
随机推荐
- Java Web 学习与总结(一)Servlet基础
配置环境:https://www.cnblogs.com/qq965921539/p/9821374.html 简介: Servlet是Sun公司提供的一种实现动态网页的解决方案,在制定J2EE时引入 ...
- Linux 解压 压缩文件
来源于:http://blog.csdn.net/mmllkkjj/article/details/6768294/ 解压 tar –xvf file.tar //解压 tar包tar -xzvf f ...
- ionic 项目 随笔
1,首先 会进入src/index.html, <!-- The polyfills js is generated during the build process --> <sc ...
- python基础知识梳理----6set 集合的应用
集合内容简介: set 一: 集合简介 集合set集合是python的一个基本数据类型.一般不是很常用set.中的元素是不重复的.无序的.里里面的元素必须是可hash的tuple,bool),str, ...
- Drupal V7.3.1 框架处理不当导致SQL注入
这个漏洞本是2014年时候被人发现的,本着学习的目的,我来做个详细的分析.漏洞虽然很早了,新版的Drupal甚至已经改变了框架的组织方式.但是丝毫不影响对于漏洞的分析.这是一个经典的使用PDO,但是处 ...
- 【性能测试】:loadrunner直压MYSQL数据库的脚本开发
有时性能测试,会涉及到直接压测数据库,测试数据库处理sql的水平,或者通过sql脚本向数据库写数据做铺地数据 这里贴上一个自己用的对数据库操作的脚本 一,首先要去下载一个LR压MYSQL的一个库文件, ...
- anyncTask的3个参数(从源码可以发现其中使用了ThreadPoolExcuter线程池)
AnyncTask异步处理数据并将数据应用到视图的操作场合 一 其中包含这几个方法 1 onPreExcute() 初始化控件,例如进度条2 doInBackground() 具体的执行动作请求数据 ...
- 【chrome】设置chrome允许WebGL从本地载入资源
找到chrome安装路径,然后创建一个快捷方式,右击该快捷方式,在 目标 输入框中加上-allow-file-access-from-files(前面加个空格),通过该快捷方式打开chrome就可以通 ...
- 第十篇----------javascript函数的三种定义方式及区别
javascript定义函数有3种方式: //3种函数定义方式,前两种常用 /** * 1,function 语句式 * 形式:句子 * 名称:有名 * 性质:静态 * 解析时机:优先解析 * 作用域 ...
- linux通过源码安装nodejs
1.下载nodejs源码,下载地址:https://nodejs.org/en/download/ 2.下载回来后,解压缩,ubuntu系统ctrl + alt +T 打开终端 假如tar.gz压缩包 ...