今天发现客户端一个乱码问题,定位发现,是一个化学表达式,在RN 中没支持<sub>标签导致的。查了一下,如果用 text 实现,其实挺麻烦,性能也比较差。
天津大学王彬教授团队设计并合成了新型Meerwein型离子对三甲基氧鎓四五氟苯基硼酸盐(Me<sub>3</sub>O\]\[B(C<sub>6</sub>F<sub>5</sub>)<sub>4</sub>\])
方法 1:使用 Text 和样式调整
React Native 的 Text 组件支持嵌套,可以通过调整 fontSize 和 lineHeight 模拟上标或下标。
import React from 'react';
import { Text, StyleSheet } from 'react-native';
export default function App() {
return (
<Text style={styles.text}>
Me
<Text style={styles.subscript}>3</Text>O
</Text>
);
}
const styles = StyleSheet.create({
text: {
fontSize: 16, // 主字体大小
},
subscript: {
fontSize: 10, // 下标字体大小
lineHeight: 16, // 对齐主文字
textAlignVertical: 'bottom',
},
});
方法 2:使用 Unicode 字符
一些常见的上下标可以直接用 Unicode 表示。例如:
- 上标数字:
¹²³ - 下标数字:
₁₂₃
import React from 'react';
import { Text } from 'react-native';
export default function App() {
return (
<Text>Me₃O</Text>
);
}
方法 3:通过 SVG 渲染
如果需要更灵活的排版,可以使用 react-native-svg 来绘制带有上下标的文字。
npm install react-native-svg
import React from 'react';
import { View } from 'react-native';
import Svg, { Text as SvgText, TSpan } from 'react-native-svg';
export default function App() {
return (
<View>
<Svg height="50" width="100">
<SvgText
x="0"
y="20"
fontSize="16"
fill="black"
>
Me
<TSpan
fontSize="10"
baselineShift="sub"
>
3
</TSpan>
O
</SvgText>
</Svg>
</View>
);
}
最终选择了使用Unicode 来进行正则替换,简单直接,兼容性好,性能好。
function replaceHtmlSubSup(input) {
// 定义上标和下标的映射
const superscriptMap = { 0: '⁰', 1: '¹', 2: '²', 3: '³', 4: '⁴', 5: '⁵', 6: '⁶', 7: '⁷', 8: '⁸', 9: '⁹' };
const subscriptMap = { 0: '₀', 1: '₁', 2: '₂', 3: '₃', 4: '₄', 5: '₅', 6: '₆', 7: '₇', 8: '₈', 9: '₉' };
// 替换下标 <sub>...</sub>
input = input.replace(/<sub>(\d+)<\/sub>/g, (_, digits) => {
return digits.split('').map(digit => subscriptMap[digit]).join('');
});
// 替换上标 <sup>...</sup>
input = input.replace(/<sup>(\d+)<\/sup>/g, (_, digits) => {
return digits.split('').map(digit => superscriptMap[digit]).join('');
});
return input;
}
// 示例测试
const htmlText = "H<sub>2</sub>O and E = mc<sup>2</sup>";
const result = replaceHtmlSubSup(htmlText);
console.log(result);
// 输出: H₂O and E = mc²