Как перевернуть письмо вверх ногами?

Здесь я пытаюсь перевернуть английское письмо вверх дном для моего почтового шаблона.

Ну, я могу получить его вручную. Теперь я вручную

как

 content.append("ɥ"); //actual h letter.
 content.append("ǝ")// actual e letter.

Итак, мой вопрос в том, что есть ли какой-либо трюк/метод/любой ключ, чтобы сделать это программным способом?

То, что я делаю сейчас,

switch(letter) {

case 'e':
   return 'ǝ';
}

Это выглядит странно и ищет подсказки. Спасибо за любую помощь.

Ответ 1

Попробуйте этот script, здесь: http://ideone.com/szPg6V

Вход:

  • "Итак, мой вопрос в том, есть ли какой-либо трюк/метод/любой ключ, чтобы сделать это программным путем?"

Вывод:

  • ¿ʎɐʍ ɔıʇɐɯɯɐɹboɹd uı ʇı op oʇ ǝn ןɔ ʎuɐ/poɥʇǝɯ/ʞɔıɹʇ ʎuɐ ǝɹǝɥʇ sı 'ʇɐɥʇ sı uoıʇsǝnb ʎɯ oS,

Код Java:

String normal = "abcdefghijklmnopqrstuvwxyz_,;.?!/\\'";
String split  = "ɐqɔpǝɟbɥıظʞןɯuodbɹsʇnʌʍxʎz‾'؛˙¿¡/\\,";
//maj
normal += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
split  += "∀qϽᗡƎℲƃHIſʞ˥WNOԀὉᴚS⊥∩ΛMXʎZ";
//number
normal += "0123456789";
split  += "0ƖᄅƐㄣϛ9ㄥ86";

String str = "So my question is that , is there any trick/method/any clue to do it in programmatic way ?";
String newstr = ""; 
char letter;
for (int i=0; i< str.length(); i++) {
    letter = str.charAt(i);

    int a = normal.indexOf(letter);
    newstr += (a != -1) ? split.charAt(a) : letter;
}
System.out.println(new StringBuilder(newstr).reverse().toString());

Я использую эти инструменты: http://www.upsidedowntext.com/

Ответ 2

Самый быстрый способ замены символа - это массив.

создайте массив перевернутых букв. Затем выполните проверку входящего значения и найдите его.

Java позволяет вам получить целочисленное представление символа, просто набрав int x = char a; Итак, разумно, что ваше upsidedown a будет в индексе вашего char минус самый низкий char, который вы сопоставляете (обычно строчные буквы a).

char[] updown = {'ɐ','q','ɔ','p','ə','ɟ','ƃ','ɥ','ı','ɾ','ʞ','l','ɯ','u','o','d','b','ɹ','s','ʇ','n','ʌ','ʍ','x','ʎ','z'};
//this example uses 26 chars, all lower case;
int a = 'a';
int z = 'z';

String newString = "";
for(int i=0; i<string.length; i++){
    int ch = string.charAt(i);
    if(ch>= a && ch <=z){
        newString = (updown[ch-a]) + newString;
    }
}

Здесь ссылка на IDEONE, где вы можете компилировать и тестировать себя. http://ideone.com/LombFE

Ответ 3

Я не уверен в определенном java-решении, но, видя, что строки в java используют unicode, я проверил символы юникода для их перевернутых копий здесь: http://www.fileformat.info/convert/text/upside-down-map.htm

Это не выглядит хорошим программным методом для их поиска. Однако существуют различные преобразователи, такие как http://www.fileformat.info/convert/text/upside-down.htm Вы можете генерировать конфигурационные файлы на основе ввода и вывода одного из этих типов конвертеров и использовать эти файлы конфигурации, чтобы вести выбор вверх-вниз букв

Ответ 4

Если вы ищете общий способ создания перевернутого обычного текста, нет никакого способа.

Все сайты, которые это делают, просто заменяют адекватные символы юникода, которые не имеют ничего общего с оригинальными, а для некоторых они ничего не находят. Невозможно иметь что-то похожее вверх дном j, так как вы можете видеть в других ответах, предполагаемый "перевернутый j" выглядит уродливым. Если бы вы искали перевернутый ß или @ или 5, вы тоже ничего не нашли бы. Сайты, в которых перевернутый текст игнорируют такие символы, используют что-то действительно несходное или просто ничего не делают.

Юникод имеет дело с содержимым текста, а не его ориентацией.

Вы указываете почтовые шаблоны. Если вы используете HTML, вы можете использовать этот бит CSS:

.upsidedown {
    -moz-transform: rotate(180deg);
    -webkit-transform: rotate(180deg);
    -ms-transform: rotate(180deg);
    -o-transform: rotate(180deg);
    transform: rotate(180deg);
}

Не все почтовые клиенты будут отображать его правильно.

Ответ 5

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

Пример:

//only lower case in this example, but new values can be added
enum upsideDown{
    a('ɐ'),
    b('q'),
    c('ɔ'),
    d('p'),
    e('ə'),
    f('ɟ'),
    g('ƃ'),
    h('ɥ'),
    i('ı'),
    j('ɾ'),
    k('ʞ'),
    l('l'),
    m('ɯ'),
    n('u'),
    o('o'),
    p('d'),
    q('b'),
    r('ɹ'),
    s('s'),
    t('ʇ'),
    u('n'),
    v('ʌ'),
    w('ʍ'),
    x('x'),
    y('ʎ'),
    z('z');
    private char value;

    private upsideDown(char value) {
        this.value = value;
    }
    private char getValue(){
        return value;
    }
};


public static void main(String[] args) {

    String hello = "helloworld";
    StringBuilder str = new StringBuilder(hello.length());
    for (int i = hello.length()-1; i >= 0; i--) {
        str.append(upsideDown.valueOf(String.valueOf(hello.charAt(i))).getValue());
    }
    System.out.println(str.toString());

}

Ответ 6

Я написал код, чтобы сделать это программным способом, но код очень медленный.

Код вычисляет различия между формами всех букв и измененной формой символа и выбирает ту, которая имеет минимальную область.

Пример:

a ɐ
e ǝ
i ı
o o
u n

код:

import java.awt.Font;
import java.awt.Shape;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.AffineTransform;
import java.awt.geom.Area;
import java.awt.geom.PathIterator;
import java.awt.geom.Rectangle2D;

class Main {
    private static final Font FONT = new Font(Font.MONOSPACED, Font.PLAIN, 24);

    private static Shape moveToOrigin(Shape s) {
        Rectangle2D r = s.getBounds2D();
        return AffineTransform.getTranslateInstance(-r.getX(), -r.getY())
                .createTransformedShape(s);
    }

    private static Shape flip(Shape s) {
        Rectangle2D r = s.getBounds2D();
        return AffineTransform.getRotateInstance(Math.PI, r.getCenterX(),
                r.getCenterY()).createTransformedShape(s);
    }

    private static double getArea(Shape s) {
        PathIterator path = s.getPathIterator(new AffineTransform());
        double area0 = 0;
        while (!path.isDone()) {
            double area = 0;
            double[] darray = new double[6];
            path.currentSegment(darray);
            double x0 = darray[0], y0 = darray[1];
            double x1 = x0, y1 = y0;
            path.next();
            while (path.currentSegment(darray) != PathIterator.SEG_CLOSE) {
                double x2 = darray[0], y2 = darray[1];
                area += x1 * y2 - y1 * x2;
                x1 = x2;
                y1 = y2;
                path.next();
            }
            path.next();
            area0 += Math.abs((area + x1 * y0 - y1 * x0) / 2);
        }
        return area0;
    }

    public static char findOpposite(char c) {
        FontRenderContext frc = new FontRenderContext(new AffineTransform(),
                true, false);
        GlyphVector gv1 = FONT.createGlyphVector(frc, String.valueOf(c));
        Area area1 = new Area(flip(moveToOrigin(gv1.getOutline())));

        double minDiff = 1.0 / 0.0;
        char bestChar = ' ';
        for (int i = 0; i <= Character.MAX_VALUE; i++) {
            GlyphVector gv2 = FONT.createGlyphVector(frc,
                    String.valueOf((char) i));
            Area area2 = new Area(moveToOrigin(gv2.getOutline()));
            area2.exclusiveOr(area1);

            double diff = getArea(area2);

            if (diff < minDiff) {
                minDiff = diff;
                bestChar = (char) i;
                System.err.println(bestChar + " : " + minDiff);
            }
            if (i % (Character.MAX_VALUE / 100) == 0) {
                System.err.println(i / (Character.MAX_VALUE / 100) + "%");
            }
        }
        return bestChar;
    }

    public static void main(String[] args) {
        System.out.println('a' + " " + findOpposite('a'));
        System.out.println('e' + " " + findOpposite('e'));
        System.out.println('i' + " " + findOpposite('i'));
        System.out.println('o' + " " + findOpposite('o'));
        System.out.println('u' + " " + findOpposite('u'));
    }
}