Преобразование строки в псевдоалфавит маленьких заглавных букв в Java - PullRequest
0 голосов
/ 29 января 2020

Я нашел веб-сайт , который может конвертировать любой текст в разные непонятные стили шрифта Unicode , например Small Caps pseudoalphabet.

Я заинтересован в том, чтобы сделать то же самое в Java коде. На следующем скриншоте HxD показаны байты обеих текстовых версий:

Есть ли способ сделать преобразование в Java с помощью встроенного в методах или в библиотеке? Предпочтительно результатом будет другой String объект.

Ответы [ 3 ]

2 голосов
/ 29 января 2020

Спецификация Unicode имеет официальное стабильное имя для каждого кода. Вы можете воспользоваться этим, просмотрев «LATIN LETTER SMALL CAPITAL c», используя метод Character.codePointOf (String) .

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

I поместите && c != 'X' в тест, потому что в настоящее время нет символа LATIN LETTER SMALL CAPITAL X, хотя было предложено .

Обратите внимание, что некоторые небольшие заглавные коды могут быть не во внутренней копии Java таблицы данных символов Unicode. Я обнаружил, что мне нужно использовать Java 12 или более позднюю версию, чтобы распознать их все.

2 голосов
/ 29 января 2020

Цитирование сайта, на который вы ссылались:

Что делает алфавит "псевдо"?

Одна или несколько транслитерированных букв имеют другое значение или источник, чем предполагалось. Например, в не выделенной жирным шрифтом версии Fraktur несколько букв являются «черными буквами», но большинство - «математическими фрактурами». В Faux Cyrilli c и Faux Ethiopi c буквы выбираются просто на основе поверхностных сходств, а не phoneti c или semanti c сходств.

Так что нет ни одного колодца -определенное преобразование маленьких пробок; скорее, автор преобразователя выбрал сопоставления кодовых точек для получения желаемого эффекта.

В случае маленьких заглавных букв это, вероятно, связано с тем, что в юникоде нет версии заглавных букв x.

Чтобы воссоздать тот же эффект, вам нужно будет реализовать справочную таблицу преобразования кодовых точек (которую вы можете сгенерировать, например, передав весь алфавит в преобразователь)

0 голосов
/ 29 января 2020

Я только что нашел простое решение, переведя алфавит простого текста в алфавит «маленьких прописных» Юникода следующим образом:

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);

Вывод:

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

Это не самое элегантное или расширяемое решение, но, возможно, кто-то может предложить улучшения.

...