在这里,我试图将英文字母颠倒为我的邮件模板。
我可以手动获取它。我现在正在做的是手动
就像
一样 content.append("ɥ"); //actual h letter.
content.append("ǝ")// actual e letter.
所以我的问题是,是否有任何技巧/方法/任何线索以编程方式完成?
我现在正在做的是
switch(letter) {
case 'e':
return 'ǝ';
}
看起来很奇怪并寻找提示。谢谢你的帮助。
答案 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
输入:
输出:
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());
答案 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'));
}
}