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

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

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

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

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

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace Eyuan.Common
  6. {
  7. /// <summary>
  8. /// 上下标辅助类
  9. /// </summary>
  10. public static class SuperSubScriptHelper
  11. {
  12. /// <summary>
  13. /// 转换为上标字符
  14. /// </summary>
  15. /// <param name="str"></param>
  16. /// <returns></returns>
  17. public static string ToSuperScriptStr(string str)
  18. {
  19. byte[] bytes = null;
  20. bytes = SuperSubScriptHelper.ToSuperScript(str);
  21. return Encoding.Unicode.GetString(bytes);
  22. }
  23. /// <summary>
  24. /// 转换为上标
  25. /// </summary>
  26. /// <param name="str"></param>
  27. /// <returns></returns>
  28. public static byte[] ToSuperScript(string str)
  29. {
  30. byte[] bytes = new byte[];
  31. switch (str)
  32. {
  33. case "":
  34. bytes[] = Convert.ToByte(0x20);
  35. bytes[] = Convert.ToByte(0x70);
  36. break;
  37. case "":
  38. bytes[] = Convert.ToByte(0x00);
  39. bytes[] = Convert.ToByte(0xB9);
  40. break;
  41. case "":
  42. bytes[] = Convert.ToByte(0x00);
  43. bytes[] = Convert.ToByte(0xB2);
  44. break;
  45. case "":
  46. bytes[] = Convert.ToByte(0x00);
  47. bytes[] = Convert.ToByte(0xB3);
  48. break;
  49. case "":
  50. bytes[] = Convert.ToByte(0x20);
  51. bytes[] = Convert.ToByte(0x74);
  52. break;
  53. case "":
  54. bytes[] = Convert.ToByte(0x20);
  55. bytes[] = Convert.ToByte(0x75);
  56. break;
  57. case "":
  58. bytes[] = Convert.ToByte(0x20);
  59. bytes[] = Convert.ToByte(0x76);
  60. break;
  61. case "":
  62. bytes[] = Convert.ToByte(0x20);
  63. bytes[] = Convert.ToByte(0x77);
  64. break;
  65. case "":
  66. bytes[] = Convert.ToByte(0x20);
  67. bytes[] = Convert.ToByte(0x78);
  68. break;
  69. case "":
  70. bytes[] = Convert.ToByte(0x20);
  71. bytes[] = Convert.ToByte(0x79);
  72. break;
  73. case "+":
  74. bytes[] = Convert.ToByte(0x20);
  75. bytes[] = Convert.ToByte(0x7A);
  76. break;
  77. case "-":
  78. bytes[] = Convert.ToByte(0x20);
  79. bytes[] = Convert.ToByte(0x7B);
  80. break;
  81. case "=":
  82. bytes[] = Convert.ToByte(0x20);
  83. bytes[] = Convert.ToByte(0x7C);
  84. break;
  85. case "(":
  86. bytes[] = Convert.ToByte(0x20);
  87. bytes[] = Convert.ToByte(0x7D);
  88. break;
  89. case ")":
  90. bytes[] = Convert.ToByte(0x20);
  91. bytes[] = Convert.ToByte(0x7E);
  92. break;
  93. case "n":
  94. bytes[] = Convert.ToByte(0x20);
  95. bytes[] = Convert.ToByte(0x7F);
  96. break;
  97. }
  98. return bytes;
  99. }
  100. /// <summary>
  101. /// 转换为下标字符
  102. /// </summary>
  103. /// <param name="str"></param>
  104. /// <returns></returns>
  105. public static string ToSubScriptStr(string str)
  106. {
  107. byte[] bytes =null;
  108. bytes = SuperSubScriptHelper.ToSubScript(str);
  109. return Encoding.Unicode.GetString(bytes);
  110. }
  111. /// <summary>
  112. /// 转换为下标字节数组
  113. /// </summary>
  114. /// <param name="str"></param>
  115. /// <returns></returns>
  116. public static byte[] ToSubScript(string str)
  117. {
  118. byte[] bytes = new byte[];
  119. switch (str)
  120. {
  121. case "":
  122. bytes[] = Convert.ToByte(0x20);
  123. bytes[] = Convert.ToByte(0x80);
  124. break;
  125. case "":
  126. bytes[] = Convert.ToByte(0x20);
  127. bytes[] = Convert.ToByte(0x81);
  128. break;
  129. case "":
  130. bytes[] = Convert.ToByte(0x20);
  131. bytes[] = Convert.ToByte(0x82);
  132. break;
  133. case "":
  134. bytes[] = Convert.ToByte(0x20);
  135. bytes[] = Convert.ToByte(0x83);
  136. break;
  137. case "":
  138. bytes[] = Convert.ToByte(0x20);
  139. bytes[] = Convert.ToByte(0x84);
  140. break;
  141. case "":
  142. bytes[] = Convert.ToByte(0x20);
  143. bytes[] = Convert.ToByte(0x85);
  144. break;
  145. case "":
  146. bytes[] = Convert.ToByte(0x20);
  147. bytes[] = Convert.ToByte(0x86);
  148. break;
  149. case "":
  150. bytes[] = Convert.ToByte(0x20);
  151. bytes[] = Convert.ToByte(0x87);
  152. break;
  153. case "":
  154. bytes[] = Convert.ToByte(0x20);
  155. bytes[] = Convert.ToByte(0x88);
  156. break;
  157. case "":
  158. bytes[] = Convert.ToByte(0x20);
  159. bytes[] = Convert.ToByte(0x89);
  160. break;
  161. case "+":
  162. bytes[] = Convert.ToByte(0x20);
  163. bytes[] = Convert.ToByte(0x8A);
  164. break;
  165. case "-":
  166. bytes[] = Convert.ToByte(0x20);
  167. bytes[] = Convert.ToByte(0x8B);
  168. break;
  169. case "=":
  170. bytes[] = Convert.ToByte(0x20);
  171. bytes[] = Convert.ToByte(0x8C);
  172. break;
  173. case "(":
  174. bytes[] = Convert.ToByte(0x20);
  175. bytes[] = Convert.ToByte(0x8D);
  176. break;
  177. case ")":
  178. bytes[] = Convert.ToByte(0x20);
  179. bytes[] = Convert.ToByte(0x8E);
  180. break;
  181. //case "n":
  182. // bytes[1] = Convert.ToByte(0x20);
  183. // bytes[0] = Convert.ToByte(0x8F);
  184. // break;
  185. }
  186. return bytes;
  187. }
  188. }
  189. }

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. 【汉化】Acunetix Web Vulnerability Scanner 11.x汉化包

    破解补丁::http://www.52pojie.cn/thread-609275-1-1.html 汉化界面截图: 登陆界面 仪表盘 目标   漏洞 扫描 用户配置 汉化详情: 1.对UI界面大部分 ...

  2. 哈工大ComingX-创新工场俱乐部正式成立

    当我把这两个Logo放在一起的时候,我有一种感觉,这种感觉同样存在于ComingX队员的心中.大学我们走到了一起,非你我所预料,却又如此自然.在感恩节的零点,我迫不及待地告诉各位ComingX队员和关 ...

  3. 【Quartz】解密properties配置文件中的账号密码

    在配置quartz时,为了保密某些信息(特别是账号密码),通常会使用密文.那么在实际使用这些配置信息时,需要进行解密.本文提供一种解密方法如下: (1)假设在properties文件中加密了账号密码 ...

  4. TX2 刷机时遇到Parsing board information failed

    因为之前调试I2C时,修改了EEPROM Layout,所以,在刷机时遇到此问题. 解决办法是按照此文档中的介绍来修改布局. 实际操作时,我拿了一块正常的TX2,按照指令: sudo i2cdump ...

  5. Codeforces Round #556 (Div. 2)-ABC(这次的题前三题真心水)

    A. Stock Arbitraging 直接上代码: #include<cstdio> #include<cstring> #include<iostream> ...

  6. 用AndroidSDK中的Face Detector实现人脸识别

    很多手机图片管理应用都开始集成人脸识别功能.一提到人脸识别,模式识别,滤波,BlahBlah 一堆复杂的技术名字戳入脑海中,立刻觉得这玩意儿没法碰,太玄乎了.其实Android SDK从1.0版本中( ...

  7. (转)rsync+inotify实时同步

    原文:http://lxw66.blog.51cto.com/5547576/1331048 声明:rsync inotify 需要逆向思考,当只做rsync不实时同步时,我们一般是从rsync服务端 ...

  8. MySQL3534

    1.mysqld install 2.mysqld --initialize-insecure自动生成无密码的root用户 3.mysql -uroot即可登录

  9. Elastic-Job源码分析之AbstractElasticJobExecutor分析

    还记得我们在JobScheduler中,在创建任务详情时,会调用一个建造器JobBuilder来创建一个Job,类型是LiteJob. LiteJob.java /** * Lite调度作业. * * ...

  10. Http的Get和Post--扫盲篇

    Http Get请求,根据Http规范Get用于服务器信息的获取,而且安全及幂等的.其中安全的在此处的含义是:不会对服务器数据造成修改.增加.以及数据状态的改变. Http Post请求,表示可能修改 ...