*将字符串的大小写字母,数字中的特殊字体替换成普通字体
* 拉丁字母:
* 粗体、斜体、粗斜体、手写体、手写粗体、哥特体(德文尖角体)、
* 双线体、哥特粗体、无衬线体、无衬线粗体、无衬线斜体、无衬线粗斜体、等宽字体
*
* 希腊字母与符号:
* 粗体、斜体、粗斜体、无衬线粗体、无衬线粗斜体
*
* 数字:
* 粗体、双线体、无衬线体、无衬线粗体、等宽字体
*/
public
static
String replaceMathAlphabets(String input) {
Map<Integer, Character> unicodeMap = getUnicodeMap();
StringBuilder output =
new
StringBuilder();
for
(
int
i =
0
; i < input.length();) {
int
codePoint = input.codePointAt(i);
char
replacementChar = getOrDefault(unicodeMap, codePoint, (
char
) codePoint);
output.append(replacementChar);
i += Character.charCount(codePoint);
}
return
output.toString();
}
public
static
<K, V> V getOrDefault(Map<K, V> map, K key, V defaultValue) {
return
map.containsKey(key) ? map.get(key) : defaultValue;
}
private
static
Map<Integer, Character> getUnicodeMap() {
Map<Integer, Character> map =
new
HashMap<>()
// 粗体
//大写字母A-Z
for
(
int
i =
0x1D400
, j =
'A'
; i <=
0x1D419
; i++, j++) {
map.put(i, (
char
) j);
}
// 小写字母a-z
for
(
int
i =
0x1D41A
, j =
'a'
; i <=
0x1D433
; i++, j++) {
map.put(i, (
char
) j);
}
//希腊字母
for
(
int
i =
0x1D6A8
, j =
'Α'
; i <=
0x1D6C0
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D6C2
, j =
'α'
; i <=
0x1D6DA
; i++, j++) {
map.put(i, (
char
) j);
}
// 数字0-9
for
(
int
i =
0x1D7CE
, j =
'0'
; i <=
0x1D7D7
; i++, j++) {
map.put(i, (
char
) j);
}
// 斜体
for
(
int
i =
0x1D434
, j =
'A'
; i <=
0x1D44D
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D44E
, j =
'a'
; i <=
0x1D467
; i++, j++) {
map.put(i, (
char
) j);
}
//希腊字母
for
(
int
i =
0x1D6E2
, j =
'Α'
; i <=
0x1D6FA
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D6FC
, j =
'α'
; i <=
0x1D714
; i++, j++) {
map.put(i, (
char
) j);
}
// 粗斜体
for
(
int
i =
0x1D468
, j =
'A'
; i <=
0x1D481
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D482
, j =
'a'
; i <=
0x1D49B
; i++, j++) {
map.put(i, (
char
) j);
}
//希腊字母
for
(
int
i =
0x1D71C
, j =
'Α'
; i <=
0x1D734
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D736
, j =
'α'
; i <=
0x1D74E
; i++, j++) {
map.put(i, (
char
) j);
}
// 手写体
for
(
int
i =
0x1D49C
, j =
'A'
; i <=
0x1D4B5
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D4B6
, j =
'a'
; i <=
0x1D4CF
; i++, j++) {
map.put(i, (
char
) j);
}
// 手写粗体
for
(
int
i =
0x1D4D0
, j =
'A'
; i <=
0x1D4E9
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D4EA
, j =
'a'
; i <=
0x1D503
; i++, j++) {
map.put(i, (
char
) j);
}
// 哥特体(德文尖角体)
for
(
int
i =
0x1D504
, j =
'A'
; i <=
0x1D51D
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D51E
, j =
'a'
; i <=
0x1D537
; i++, j++) {
map.put(i, (
char
) j);
}
// 哥特粗体
for
(
int
i =
0x1D56C
, j =
'A'
; i <=
0x1D585
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D586
, j =
'a'
; i <=
0x1D59F
; i++, j++) {
map.put(i, (
char
) j);
}
// 双线体
for
(
int
i =
0x1D538
, j =
'A'
; i <=
0x1D551
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D552
, j =
'a'
; i <=
0x1D56B
; i++, j++) {
map.put(i, (
char
) j);
}
//数字
for
(
int
i =
0x1D7D8
, j =
'0'
; i <=
0x1D7E1
; i++, j++) {
map.put(i, (
char
) j);
}
// 无衬线体
for
(
int
i =
0x1D5A0
, j =
'A'
; i <=
0x1D5B9
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D5BA
, j =
'a'
; i <=
0x1D5D3
; i++, j++) {
map.put(i, (
char
) j);
}
//数字
for
(
int
i =
0x1D7E2
, j =
'0'
; i <=
0x1D7EB
; i++, j++) {
map.put(i, (
char
) j);
}
// 无衬线粗体
for
(
int
i =
0x1D5D4
, j =
'A'
; i <=
0x1D5ED
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D5EE
, j =
'a'
; i <=
0x1D607
; i++, j++) {
map.put(i, (
char
) j);
}
//希腊字母
for
(
int
i =
0x1D756
, j =
'Α'
; i <=
0x1D76E
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D770
, j =
'α'
; i <=
0x1D788
; i++, j++) {
map.put(i, (
char
) j);
}
//数字
for
(
int
i =
0x1D7EC
, j =
'0'
; i <=
0x1D7F5
; i++, j++) {
map.put(i, (
char
) j);
}
// 无衬线斜体
for
(
int
i =
0x1D608
, j =
'A'
; i <=
0x1D621
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D622
, j =
'a'
; i <=
0x1D63B
; i++, j++) {
map.put(i, (
char
) j);
}
// 无衬线粗斜体
for
(
int
i =
0x1D63C
, j =
'A'
; i <=
0x1D655
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D656
, j =
'a'
; i <=
0x1D66F
; i++, j++) {
map.put(i, (
char
) j);
}
//希腊字母
for
(
int
i =
0x1D790
, j =
'Α'
; i <=
0x1D7A8
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D7AA
, j =
'α'
; i <=
0x1D7C2
; i++, j++) {
map.put(i, (
char
) j);
}
// 等宽字体
for
(
int
i =
0x1D670
, j =
'A'
; i <=
0x1D689
; i++, j++) {
map.put(i, (
char
) j);
}
for
(
int
i =
0x1D68A
, j =
'a'
; i <=
0x1D6A3
; i++, j++) {
map.put(i, (
char
) j);
}
//数字
for
(
int
i =
0x1D7F6
, j =
'0'
; i <=
0x1D7FF
; i++, j++) {
map.put(i, (
char
) j);
}
return
map;
}