Как перевернуть письмо вверх ногами?
Здесь я пытаюсь перевернуть английское письмо вверх дном для моего почтового шаблона.
Ну, я могу получить его вручную. Теперь я вручную
как
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'));
}
}