如何翻转一个字母?

时间:2014-06-23 17:37:30

标签: java character-encoding char

在这里,我试图将英文字母颠倒为我的邮件模板。

我可以手动获取它。我现在正在做的是手动

就像

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

所以我的问题是,是否有任何技巧/方法/任何线索以编程方式完成?

我现在正在做的是

switch(letter) {

case 'e':
   return 'ǝ';
}

看起来很奇怪并寻找提示。谢谢你的帮助。

6 个答案:

答案 0 :(得分:5)

更换字符的最快方法是使用数组。

创建一系列倒置字母。然后,检查进来的值并找到它的匹配。

Java允许您通过简单地转换int x = char a;来获取字符的整数表示。因此,可以理解您的倒置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

答案 1 :(得分:5)

我不确定特定于java的解决方案,但是看到java中的字符串使用unicode,我在这里检查了颠倒对应的unicode字符:http://www.fileformat.info/convert/text/upside-down-map.htm

看起来并不是一个很好的编程方法来找到它们。但是,有各种转换器,例如http://www.fileformat.info/convert/text/upside-down.htm 您可以根据这些类型的转换器之一的输入和输出生成配置文件,并使用这些配置文件来驱动您颠倒的字母选择

答案 2 :(得分:4)

如果您正在寻找一种创建颠倒的普通文字的通用方法,那就没办法了。

所有这样做的网站,只需替换与原始网站没有任何共同点的足够的unicode字符,对于某些人来说,他们找不到任何东西。没有办法让任何看起来像颠倒的j,所以你可以在其他答案中看到所谓的'倒立j&#34;看起来很难看。如果您正在寻找颠倒的ß@5,您也无法找到任何内容。做颠倒文本的网站要么忽略这些符号,要么使用非常不相似的东西,要么根本不做任何事情。

Unicode处理文本内容,而不是其方向。

您提到邮件模板。如果您使用的是HTML,则可以使用CSS:

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

并非所有邮件客户端都会正确显示它。

答案 3 :(得分:2)

如果您不喜欢上述任何示例,则可以始终使用枚举。通过这种方式,您可以使用各自的倒置等效字符添加其他字符。

示例

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

}

答案 4 :(得分:2)

在此处尝试此脚本:http://ideone.com/szPg6V

输入:

  • '所以我的问题是,是否有任何技巧/方法/任何线索以编程方式完成?'

输出:

  • ,¿ʎɐʍɔʇɐɯɯɐɹɹɹu u op op opɐɐɐɥʇǝɯɥʇǝɯɥʇǝɯɥʇǝɯɥʇǝɯɥʇǝɯɥʇǝɯɥʇǝɯıııııııııoʇb b b b b S S,

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/

答案 5 :(得分:1)

我编写了一个以编程方式执行此操作的代码,但代码非常慢。

代码计算所有字母形状和翻转字符形状之间的差异,并选择面积最小的字母。

示例:

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