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直接输 ...
随机推荐
- centos绑定https
1.百度云申请免费ssl证书 一年一申请 2. https://www.wosign .com /faq/faq-apache-https.htm 3.注意ssl.conf里面各个证书的顺序 证书路径 ...
- UDP的优点
UDP优点 关于何时.发送什么数据的应用层控制更为精细 只需要应用层把数据传给UDP,UDP就把数据打包到网络层.对于TCP来说,存在一个拥塞控制机制,当链路变得拥塞时,会抑制TCP发送方,并造成数据 ...
- Oracle to_char的用法
The following are number examples for the to_char function. to_char(1210.73, '9999.9') would return ...
- Markdown数学公式速查记录
参考: Markdown数学公式语法 markdown最全数学公式速查 行内与独行 行内公式:将公式插入到本行内,符号:$公式内容$,如:$xyz$ 独行公式:将公式插入到新的一行内,并且居中,符号: ...
- [LibreOJ #2983]【WC2019】数树【计数】【DP】【多项式】
Description 此题含有三个子问题 问题1: 给出n个点的两棵树,记m为只保留同时在两棵树中的边时连通块的个数,求\(y^m\) 问题2: 给出n个点的一棵树,另外一棵树任意生成,求所有方案总 ...
- noip | 题目 | noip数据 收集站 | noipdata
这是什么 一个NOIP历年比赛数据及题目的收集站,方便大家查找使用 网站链接:https://noipdata.github.io 点击这里立即跳转 新连接:noipdata.rcxzsc.com 点 ...
- 在微信移动端input file拍照或从相册选择照片后会自动刷新页面退回到一开始网站进入的页面
<input type="file" accept="image/*"/> 调用打开摄像头后,聚焦后拍照,点击确认,这时页面会出现刷新动作,然后回退 ...
- AI简单平移追踪算法
1.比较坐标追踪法 追踪者会不停地比较自身和目标的x坐标和y坐标,每x和y上一个单位的移动为一个周期,该算法虽然简单好用,但实用性差且不智能化,如果追踪者数量增加,路线会显得单调,由于都是先走个对角线 ...
- Mac 10.12安装WebStorm
下载: (链接: https://pan.baidu.com/s/1c2o8wUG 密码: 2waz)
- Linux系统编程:socket网络编程(操作篇)
一.问题思考 问1.网络通信应用在什么场合?通信的前提是什么? 答1.主要应用在不同主机进程间的互相通信,同一主机的进程也可以使用网络进行通信.通信的前提是如何标识通信进程的唯一,由于不同主机的进程极 ...