forname - java设置utf8




如何颠倒一个字母? (4)

做字符替换的最快方法是一个数组。

创建一个颠倒的字母数组。 然后,检查价值进来,并找到匹配。

Java允许你通过简单地转换int x = char a;来获得一个字符的整数表示x = char a; 所以,有理由认为,你的颠倒是在你的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

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

那么我可以手动得到它。 我正在做的是现在手动

就像

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

所以我的问题是,有什么技巧/方法/任何线索,以编程的方式吗?

我现在正在做的是

switch(letter) {

case 'e':
   return 'ǝ';
}

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


如果你不喜欢上面的任何一个例子,你总是可以使用枚举。 这样,你可以添加其他字符,你可能需要与他们各自的颠倒等值。

例如

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

}

我不确定java特定的解决方案,但看到作为字符串在Java中使用Unicode,我检查了unicode字符为他们倒过来对手在这里: http : //www.fileformat.info/convert/text/upside-下map.htm

看起来没有一个好的编程方法来找到这些。 但是,有许多转换器,像这样一个http://www.fileformat.info/convert/text/upside-down.htm您可以生成基于这些类型的转换器之一的输入和输出的配置文件,并使用那些配置文件来驱动你的颠倒信件选择


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

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

例:

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






char