我找到了一个网站可以将任何文本转换为不同的模糊 unicode 字体样式,例如
Small Caps pseudoalphabet
.
HxD
屏幕截图显示了两个文本版本的字节:
有什么方法可以使用内置方法或库在 Java 中进行转换?最好的结果是另一个
String
对象。
引用您链接的网站:
什么使字母表“伪”?
一个或多个音译字母的含义或来源与预期不同。在 Fraktur 的非粗体版本中,对于 例如,有几个字母是“黑色字母”,但大多数是“数学字母” fraktur”。在 Faux Cyrillic 和 Faux Ethiopic 中,字母被选中 仅仅基于表面的相似性,而不是语音或 语义相似性。
所以没有明确定义的小型股转换;相反,转换器的作者精心挑选了代码点映射以提供所需的效果。
对于小型大写字母,这可能是因为 unicode 中没有
x
的小型大写版本。
为了重新创建相同的效果,您必须实现一个代码点转换查找表(您可以通过例如将整个字母表传递给转换器来生成)
Unicode 规范对每个代码点都有一个正式的、稳定的名称。您可以通过使用方法 Character.codePointOf(String). 查找“拉丁字母小写字母c
”来利用这一点public static String translate(String s) {
int len = s.length();
Formatter smallCaps = new Formatter(new StringBuilder(len));
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
if (c >= 'A' && c <= 'Z' && c != 'X') {
smallCaps.format("%c",
Character.codePointOf("LATIN LETTER SMALL CAPITAL " + c));
} else {
smallCaps.format("%c", c);
}
}
return smallCaps.toString();
}
我把
&& c != 'X'
放在测试中,因为目前没有拉丁字母小写字母X字符,虽然已经提出了.
请注意,一些小的大写代码点可能不在 Java 的 Unicode 字符数据表的内部副本中。我发现我需要使用 Java 12 或更高版本才能识别它们。
@BullyWiiPlaza 发布的answer 很好,但是代码效率很低。
这是一个替代实现,它会更快并且使用更少的内存:
private static final char[] SMALL_CAPS_ALPHABET = "ᴀʙᴄᴅᴇꜰɢʜɪᴊᴋʟᴍɴᴏᴩqʀꜱᴛᴜᴠᴡxyᴢ".toCharArray();
private static String toSmallCaps(String text)
{
if(null == text) {
return null;
}
int length = text.length();
StringBuilder smallCaps = new StringBuilder(length);
for(int i=0; i<length; ++i) {
char c = text.charAt(i);
if(c >= 'a' && c <= 'z') {
smallCaps.append(SMALL_CAPS_ALPHABET[c - 'a']);
} else {
smallCaps.append(c);
}
}
return smallCaps.toString();
}
我刚刚通过将纯文本字母表翻译成 Unicode“小型大写字母”字母表找到了一个简单的解决方案,如下所示:
private static final String[] ALPHABET = "abcdefghijklmnopqrstuvwxyz".split("");
private static final String[] SMALL_CAPS_ALPHABET = "ᴀʙᴄᴅᴇꜰɢʜɪᴊᴋʟᴍɴᴏᴩqʀꜱᴛᴜᴠᴡxyᴢ".split("");
private static String toSmallCaps(String text)
{
text = text.toLowerCase();
StringBuilder convertedBuilder = new StringBuilder();
for (char textCharacter : text.toCharArray())
{
int index = 0;
boolean successfullyTranslated = false;
for (String alphabetLetter : ALPHABET)
{
if ((textCharacter + "").equals(alphabetLetter))
{
convertedBuilder.append(SMALL_CAPS_ALPHABET[index]);
successfullyTranslated = true;
break;
}
index++;
}
if (!successfullyTranslated)
{
convertedBuilder.append(textCharacter);
}
}
return convertedBuilder.toString();
}
用法:
String smallCaps = toSmallCaps("Hello StackOverflow!");
System.out.println(smallCaps);
输出:
ʜᴇʟʟᴏ ꜱᴛᴀᴄᴋᴏᴠᴇʀꜰʟᴏᴡ!
这不是最优雅或可扩展的解决方案,但也许有人可以提出改进建议。