在 Java 中将字符串转换为小型大写伪字母表

问题描述 投票:0回答:4

我找到了一个网站可以将任何文本转换为不同的模糊 unicode 字体样式,例如

Small Caps pseudoalphabet
.

我有兴趣在 Java 代码中做同样的事情。以下

HxD
屏幕截图显示了两个文本版本的字节:

有什么方法可以使用内置方法或库在 Java 中进行转换?最好的结果是另一个

String
对象。

java unicode unicode-string
4个回答
2
投票

引用您链接的网站:

什么使字母表“伪”?

一个或多个音译字母的含义或来源与预期不同。在 Fraktur 的非粗体版本中,对于 例如,有几个字母是“黑色字母”,但大多数是“数学字母” fraktur”。在 Faux Cyrillic 和 Faux Ethiopic 中,字母被选中 仅仅基于表面的相似性,而不是语音或 语义相似性。

所以没有明确定义的小型股转换;相反,转换器的作者精心挑选了代码点映射以提供所需的效果。

对于小型大写字母,这可能是因为 unicode 中没有

x
的小型大写版本。

为了重新创建相同的效果,您必须实现一个代码点转换查找表(您可以通过例如将整个字母表传递给转换器来生成)


2
投票

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 或更高版本才能识别它们。


1
投票

@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();
}

0
投票

我刚刚通过将纯文本字母表翻译成 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);

输出:

ʜᴇʟʟᴏ ꜱᴛᴀᴄᴋᴏᴠᴇʀꜰʟᴏᴡ!

这不是最优雅或可扩展的解决方案,但也许有人可以提出改进建议。

© www.soinside.com 2019 - 2024. All rights reserved.