Ich erhalte erfolgreich arabischen Text vom Server. Abgerufener Text Ich möchte im Code angezeigt werden, aber es werden Kästchen anstelle von arabischem Text angezeigt. Angenommen, t
Array-Werte sind arabischer Text vom Server.
string[] t={" "};
Textview tv = (Textview) findviewByid(R.id.text);
tv.setText(t[0]);
Antworten:
Android 2.1 hat keine arabische Schrift.
Android 2.2 hat arabische Schrift, zeigt Ihr Wort jedoch nicht richtig an.
Android 3.x unterstützt Arabisch vollständig.
Für Android 2.1 müssen Sie die Schriftart einstellen
Farsi.GetFarsiFont(this)
und dann verwendenFarsi.Convert("سلام")
Für Android 2.2 müssen Sie keine Schriftart einstellen, sondern müssen verwenden
Farsi.Convert("سلام")
Und für Android 3.x alle oben genannten Lösungen vergessen;). Sie können die Schriftart jedoch ändern, wenn Ihnen die arabische Schriftart 3.x nicht gefällt.
Führen Sie die folgenden Schritte aus:
1) Fügen Sie zunächst "TAHOMA.TTF" in den Assets-Ordner ein
2) Verwenden Sie die folgende Klasse, um die Schriftart zu erhalten und Ihren arabischen oder farsischen Text in eine gute Form für die Anzeige in Ihren Aktivitäten zu konvertieren.
import android.content.Context; import android.graphics.Typeface; public final class Farsi { public static boolean isFarsiConversionNeeded = true; private final static String szLamAndAlef = Character .toString((char) 0xfedf) + Character.toString((char) 0xfe8e); // Lam + Alef private final static String szLamStickAndAlef = Character .toString((char) 0xfee0) + Character.toString((char) 0xfe8e); // Lam (Sticky !!!)+ // Alef private final static String szLa = Character.toString((char) 0xfefb); // La private final static String szLaStick = Character.toString((char) 0xfefc); // La // (Sticky!!!) private final static String szLamAndAlefWoosim = Character .toString((char) 0xe1) + Character.toString((char) 0xbb); // Lam + Alef private final static String szLamStickAndAlefWoosim = Character .toString((char) 0x90) + Character.toString((char) 0xbb); // Lam (Sticky !!!)+ // Alef private final static String szLaWoosim = Character.toString((char) 0xd9); // La private final static String szLaStickWoosim = Character .toString((char) 0xd9); // La // (Sticky!!!) private static final class struc { public char character; public char endGlyph; public char iniGlyph; public char midGlyph; public char isoGlyph; public struc(char Character, char EndGlyph, char IniGlyph, char MidGlyph, char IsoGlyph) { character = Character; endGlyph = EndGlyph; iniGlyph = IniGlyph; midGlyph = MidGlyph; isoGlyph = IsoGlyph; } } static struc[] arrStruc = { new struc((char) 0x630, (char) 0xfeac, (char) 0xfeab, (char) 0xfeac, (char) 0xfeab), new struc((char) 0x62f, (char) 0xfeaa, (char) 0xfea9, (char) 0xfeaa, (char) 0xfea9), new struc((char) 0x62c, (char) 0xfe9e, (char) 0xfe9f, (char) 0xfea0, (char) 0xfe9d), new struc((char) 0x62d, (char) 0xfea2, (char) 0xfea3, (char) 0xfea4, (char) 0xfea1), new struc((char) 0x62e, (char) 0xfea6, (char) 0xfea7, (char) 0xfea8, (char) 0xfea5), new struc((char) 0x647, (char) 0xfeea, (char) 0xfeeb, (char) 0xfeec, (char) 0xfee9), new struc((char) 0x639, (char) 0xfeca, (char) 0xfecb, (char) 0xfecc, (char) 0xfec9), new struc((char) 0x63a, (char) 0xfece, (char) 0xfecf, (char) 0xfed0, (char) 0xfecd), new struc((char) 0x641, (char) 0xfed2, (char) 0xfed3, (char) 0xfed4, (char) 0xfed1), new struc((char) 0x642, (char) 0xfed6, (char) 0xfed7, (char) 0xfed8, (char) 0xfed5), new struc((char) 0x62b, (char) 0xfe9a, (char) 0xfe9b, (char) 0xfe9c, (char) 0xfe99), new struc((char) 0x635, (char) 0xfeba, (char) 0xfebb, (char) 0xfebc, (char) 0xfeb9), new struc((char) 0x636, (char) 0xfebe, (char) 0xfebf, (char) 0xfec0, (char) 0xfebd), new struc((char) 0x637, (char) 0xfec2, (char) 0xfec3, (char) 0xfec4, (char) 0xfec1), new struc((char) 0x643, (char) 0xfeda, (char) 0xfedb, (char) 0xfedc, (char) 0xfed9), new struc((char) 0x645, (char) 0xfee2, (char) 0xfee3, (char) 0xfee4, (char) 0xfee1), new struc((char) 0x646, (char) 0xfee6, (char) 0xfee7, (char) 0xfee8, (char) 0xfee5), new struc((char) 0x62a, (char) 0xfe96, (char) 0xfe97, (char) 0xfe98, (char) 0xfe95), new struc((char) 0x627, (char) 0xfe8e, (char) 0xfe8d, (char) 0xfe8e, (char) 0xfe8d), new struc((char) 0x644, (char) 0xfede, (char) 0xfedf, (char) 0xfee0, (char) 0xfedd), new struc((char) 0x628, (char) 0xfe90, (char) 0xfe91, (char) 0xfe92, (char) 0xfe8f), new struc((char) 0x64a, (char) 0xfef2, (char) 0xfef3, (char) 0xfef4, (char) 0xfef1), new struc((char) 0x633, (char) 0xfeb2, (char) 0xfeb3, (char) 0xfeb4, (char) 0xfeb1), new struc((char) 0x634, (char) 0xfeb6, (char) 0xfeb7, (char) 0xfeb8, (char) 0xfeb5), new struc((char) 0x638, (char) 0xfec6, (char) 0xfec7, (char) 0xfec8, (char) 0xfec5), new struc((char) 0x632, (char) 0xfeb0, (char) 0xfeaf, (char) 0xfeb0, (char) 0xfeaf), new struc((char) 0x648, (char) 0xfeee, (char) 0xfeed, (char) 0xfeee, (char) 0xfeed), new struc((char) 0x629, (char) 0xfe94, (char) 0xfe93, (char) 0xfe93, (char) 0xfe93), new struc((char) 0x649, (char) 0xfef0, (char) 0xfeef, (char) 0xfef0, (char) 0xfeef), new struc((char) 0x631, (char) 0xfeae, (char) 0xfead, (char) 0xfeae, (char) 0xfead), new struc((char) 0x624, (char) 0xfe86, (char) 0xfe85, (char) 0xfe86, (char) 0xfe85), new struc((char) 0x621, (char) 0xfe80, (char) 0xfe80, (char) 0xfe80, (char) 0xfe80), new struc((char) 0x626, (char) 0xfe8a, (char) 0xfe8b, (char) 0xfe8c, (char) 0xfe89), new struc((char) 0x623, (char) 0xfe84, (char) 0xfe83, (char) 0xfe84, (char) 0xfe83), new struc((char) 0x622, (char) 0xfe82, (char) 0xfe81, (char) 0xfe82, (char) 0xfe81), new struc((char) 0x625, (char) 0xfe88, (char) 0xfe87, (char) 0xfe88, (char) 0xfe87), new struc((char) 0x67e, (char) 0xfb57, (char) 0xfb58, (char) 0xfb59, (char) 0xfb56), // peh new struc((char) 0x686, (char) 0xfb7b, (char) 0xfb7c, (char) 0xfb7d, (char) 0xfb7a), // cheh new struc((char) 0x698, (char) 0xfb8b, (char) 0xfb8a, (char) 0xfb8b, (char) 0xfb8a), // jeh new struc((char) 0x6a9, (char) 0xfb8f, (char) 0xfb90, (char) 0xfb91, (char) 0xfb8e), // keheh new struc((char) 0x6af, (char) 0xfb93, (char) 0xfb94, (char) 0xfb95, (char) 0xfb92), // gaf // new struc((char) 0x6cc, (char) 0xfbfd, (char) 0xfbfe, // (char) 0xfbff, (char) 0xfbfc), // Farsi yeh new struc((char) 0x6cc, (char) 0xfbfd, (char) 0xfef3, (char) 0xfef4, (char) 0xfbfc), // Arabic yeh new struc((char) 0x6c0, (char) 0xfba5, (char) 0xfba4, (char) 0xfba5, (char) 0xfba4) // heh with yeh }; static struc[] arrStrucWoosim = { new struc((char) 0x630, (char) 0xb5, (char) 0x82, (char) 0xb5, (char) 0x82), new struc((char) 0x62f, (char) 0xb4, (char) 0x81, (char) 0xb4, (char) 0x81), new struc((char) 0x62c, (char) 0x9b, (char) 0xb1, (char) 0xf9, (char) 0xbf), new struc((char) 0x62d, (char) 0x9c, (char) 0xb2, (char) 0xfa, (char) 0xc0), new struc((char) 0x62e, (char) 0x9d, (char) 0xb3, (char) 0xfe, (char) 0xc1), new struc((char) 0x647, (char) 0xac, (char) 0xe4, (char) 0x93, (char) 0xd5), new struc((char) 0x639, (char) 0xc9, (char) 0xd3, (char) 0x8b, (char) 0xa4), new struc((char) 0x63a, (char) 0xca, (char) 0xdd, (char) 0x8c, (char) 0xa5), new struc((char) 0x641, (char) 0xa6, (char) 0xde, (char) 0x8d, (char) 0xcc), new struc((char) 0x642, (char) 0xa7, (char) 0xdf, (char) 0x8e, (char) 0xce), new struc((char) 0x62b, (char) 0xbd, (char) 0xaf, (char) 0xea, (char) 0x99), new struc((char) 0x635, (char) 0xc4, (char) 0xc8, (char) 0x87, (char) 0xa0), new struc((char) 0x636, (char) 0xc5, (char) 0xcb, (char) 0x88, (char) 0xa1), new struc((char) 0x637, (char) 0xc6, (char) 0xcd, (char) 0xcd, (char) 0xa2), new struc((char) 0x643, (char) 0xcf, (char) 0xe0, (char) 0x8f, (char) 0xa8), new struc((char) 0x645, (char) 0xd2, (char) 0xe2, (char) 0x91, (char) 0xaa), new struc((char) 0x646, (char) 0xd4, (char) 0xe3, (char) 0x92, (char) 0xab), new struc((char) 0x62a, (char) 0xbd, (char) 0xaf, (char) 0xea, (char) 0x99), new struc((char) 0x627, (char) 0xbb, (char) 0x80, (char) 0xbb, (char) 0x80), new struc((char) 0x644, (char) 0xd1, (char) 0xe1, (char) 0x90, (char) 0xa9), new struc((char) 0x628, (char) 0xbc, (char) 0xae, (char) 0xe9, (char) 0x98), new struc((char) 0x64a, (char) 0xdc, (char) 0xe6, (char) 0x95, (char) 0xdc), new struc((char) 0x633, (char) 0xc2, (char) 0xb8, (char) 0xb8, (char) 0x9e), new struc((char) 0x634, (char) 0xc3, (char) 0xb9, (char) 0xb9, (char) 0x9f), new struc((char) 0x638, (char) 0xc7, (char) 0xcd, (char) 0xcd, (char) 0xc7), new struc((char) 0x632, (char) 0xb7, (char) 0xb7, (char) 0xb7, (char) 0xb7), new struc((char) 0x648, (char) 0x94, (char) 0x94, (char) 0x94, (char) 0x94), new struc((char) 0x629, (char) 0xda, (char) 0xda, (char) 0xda, (char) 0xda), new struc((char) 0x649, (char) 0xdc, (char) 0xe6, (char) 0x95, (char) 0xdc), new struc((char) 0x631, (char) 0xb6, (char) 0xb6, (char) 0xb6, (char) 0xb6), new struc((char) 0x624, (char) 0xe7, (char) 0xe7, (char) 0xe7, (char) 0xe7), new struc((char) 0x621, (char) 0xba, (char) 0xba, (char) 0xba, (char) 0xba), new struc((char) 0x626, (char) 0xd7, (char) 0xe8, (char) 0x97, (char) 0xd7), new struc((char) 0x623, (char) 0x80, (char) 0x80, (char) 0x80, (char) 0x80), new struc((char) 0x622, (char) 0x80, (char) 0x80, (char) 0x80, (char) 0x80), new struc((char) 0x625, (char) 0x80, (char) 0x80, (char) 0x80, (char) 0x80), new struc((char) 0x67e, (char) 0xbc, (char) 0xae, (char) 0xe9, (char) 0x98), // peh new struc((char) 0x686, (char) 0x9b, (char) 0xb1, (char) 0xf9, (char) 0xbf), // cheh new struc((char) 0x698, (char) 0xb7, (char) 0xb7, (char) 0xb7, (char) 0xb7), // jeh new struc((char) 0x6a9, (char) 0xcf, (char) 0xe0, (char) 0x8f, (char) 0xa8), // keheh new struc((char) 0x6af, (char) 0xcf, (char) 0xe0, (char) 0x8f, (char) 0xa8), // gaf new struc((char) 0x6cc, (char) 0xdc, (char) 0xe6, (char) 0x95, (char) 0xdc), // yeh new struc((char) 0x6c0, (char) 0xac, (char) 0xe4, (char) 0x93, (char) 0xd5) // heh with yeh }; private static final int N_DISTINCT_CHARACTERS = 43; private static final String ArabicReverse(String s) { try { String Out = "", rev; s = MakeReverse(s); char[] chs = new char[s.length()]; chs = s.toCharArray(); int i = 0; while (i < s.length()) { if ((chs[i] >= '0' && chs[i] <= '9')) // isDigit(s[i]) ? { rev = ""; while (i < s.length() && ((chs[i] >= '0' && chs[i] <= '9') || chs[i] == '/')) // isDigit(s[i]) // ? { rev = rev + chs[i]; ++i; } rev = MakeReverse(rev); Out = Out + rev; } else { Out = Out + chs[i]; ++i; } } s = Out; } catch (Exception ex) { // throw new Exception( // "An exception has occurred in ArabicReverse function.\\n" // + ex.getMessage()); } return s; } private static final boolean isFromTheSet1(/* WCHAR */char ch) { char[] theSet1 = new char[] { (char) 0x62c, (char) 0x62d, (char) 0x62e, (char) 0x647, (char) 0x639, (char) 0x63a, (char) 0x641, (char) 0x642, (char) 0x62b, (char) 0x635, (char) 0x636, (char) 0x637, (char) 0x643, (char) 0x645, (char) 0x646, (char) 0x62a, (char) 0x644, (char) 0x628, (char) 0x64a, (char) 0x633, (char) 0x634, (char) 0x638, (char) 0x67e, (char) 0x686, (char) 0x6a9, (char) 0x6af, (char) 0x6cc, (char) 0x626 }; int i = 0; while (i < 28) { if (ch == theSet1[i]) return true; ++i; } return false; } private static final boolean isFromTheSet2(/* WCHAR */char ch) { char[] theSet2 = new char[] { (char) 0x627, (char) 0x623, (char) 0x625, (char) 0x622, (char) 0x62f, (char) 0x630, (char) 0x631, (char) 0x632, (char) 0x648, (char) 0x624, (char) 0x629, (char) 0x649, (char) 0x698, (char) 0x6c0 }; int i = 0; while (i < 14) { if (ch == theSet2[i]) return true; ++i; } return false; } private static final String MakeReverse(String text) { String Result = ""; char[] Ctext = new char[text.length()]; Ctext = text.toCharArray(); for (int i = (text.length()) - 1; i >= 0; i--) { Result += Ctext[i]; } return Result; } public static final String ConvertBackToRealFarsi(String In) { if (!isFarsiConversionNeeded) { return In; } String strOut = ""; StringBuilder strBuilder = new StringBuilder(""); int i = 0; int j = 0; char[] chIn = new char[In.length()]; chIn = In.toCharArray(); for (i = 0; i < In.length(); i++) { boolean found = false; for (j = 0; j < arrStruc.length; j++) { if (chIn[i] == arrStruc[j].midGlyph || chIn[i] == arrStruc[j].iniGlyph || chIn[i] == arrStruc[j].endGlyph || chIn[i] == arrStruc[j].isoGlyph) { strBuilder.append(arrStruc[j].character); found = true; break; } } if (!found) strBuilder.append(chIn[i]); } strOut = strBuilder.toString(); strOut = strOut.replace(szLa, "لا"); strOut = strOut.replace(szLaStick, "لا"); return strOut; } public static final String Convert(String In) { if (!isFarsiConversionNeeded) { return In; } if (In == null) { return ""; } boolean linkBefore, linkAfter; String Out = In; char[] chOut = new char[Out.length()]; chOut = Out.toCharArray(); char[] chIn = new char[In.length()]; chIn = In.toCharArray(); for (int i = 0; i < In.length(); i++) { /* WCHAR */ char ch = chIn[i]; if ((ch >= (char) 0x0621 && ch <= (char) 0x064a) || (ch == (char) 0x067e) || (ch == (char) 0x0686) || (ch == (char) 0x0698) || (ch == (char) 0x06a9) || (ch == (char) 0x06af) || (ch == (char) 0x06cc) || (ch == (char) 0x06c0)) // is a Farsi character? { int idx = 0; while (idx < N_DISTINCT_CHARACTERS) { if (arrStruc[idx].character == chIn[i]) break; ++idx; } if (i == In.length() - 1) linkAfter = false; else linkAfter = (isFromTheSet1(chIn[i + 1]) || isFromTheSet2(chIn[i + 1])); if (i == 0) linkBefore = false; else linkBefore = isFromTheSet1(chIn[i - 1]); if (idx < N_DISTINCT_CHARACTERS) { if (linkBefore && linkAfter) chOut[i] = arrStruc[idx].midGlyph; if (linkBefore && !linkAfter) chOut[i] = arrStruc[idx].endGlyph; if (!linkBefore && linkAfter) chOut[i] = arrStruc[idx].iniGlyph; if (!linkBefore && !linkAfter) chOut[i] = arrStruc[idx].isoGlyph; } else { chOut[i] = chIn[i]; } } else { chOut[i] = chIn[i]; } } Out = ""; for (int j = 0; j < chOut.length; j++) Out += chOut[j]; // Out = ArabicReverse(Out); Out = Out.replace((char) 0x200c, ' '); // Change NO SPACE to SPACE Out = Out.replace(szLamAndAlef, szLa); // Join 'Lam' and 'Alef' and // make 'La' Out = Out.replace(szLamStickAndAlef, szLaStick); // Join 'Lam Stick' // and 'Alef' // and make 'La // Stick' return reorderWords(Out); } private final static String reorderWords(String strIn) { final int ST_RTL = 0; final int ST_LTR = 1; String strOut = ""; String prevWord = ""; int state = ST_RTL; char[] arr = strIn.toCharArray(); int i = 0; while (i < arr.length) { if (charIsLTR(arr[i]) && state != ST_LTR) { // state changed to LTR state = ST_LTR; strOut = prevWord + strOut; prevWord = ""; prevWord += arr[i]; } else if (charIsRTL(arr[i]) && state != ST_RTL) { // state changed to RTL state = ST_RTL; strOut = prevWord + strOut; prevWord = ""; prevWord += arr[i]; } else { // state is not changed prevWord += arr[i]; } i++; } strOut = prevWord + strOut; return strOut; } private final static boolean charIsLTR(char ch) { return (ch >= (char) 65 & ch <= (char) 122) | Character.isDigit(ch); } private final static boolean charIsRTL(char ch) { return ch >= (char) 0x0621; } private static Typeface typeface; public static final Typeface GetFarsiFont(Context context) { if (typeface == null) { typeface = Typeface.createFromAsset(context.getAssets(), // "DroidSansFallback.ttf"); "TAHOMA.TTF"); } return typeface; } }
3) Und in Ihrer Aktivität:
Typeface tf = Farsi.GetFarsiFont(this); MyTextView.setTypeface(tf); MyTextView.setText(Farsi.Convert("سلام"));
genießen!
meine Referenz für die Farsi-Klasse: Arabizer
quelle
Ich möchte meine Erfahrung hinzufügen, nachdem ich einige Wochen mit Arabisch zu kämpfen hatte. Eigentlich war dieser Beitrag sehr hilfreich, wenn ich arabische Schriftarten in meiner Android-Anwendung verwende.
Ich habe die Farsi-Klasse verwendet, um Text neu anzuordnen. Aber es entspricht nicht meinen Erwartungen. weil der Kunde bei jedem Brief der Bewerbung immer zu viel Rücksicht nimmt und es sich um eine Absprache handelt.
In der Farsi-Klasse besteht ein Problem darin, dass die schließenden Klammern nicht richtig angeordnet werden können. So bemerkte ich mehrere Probleme.
Wenn ich jedoch die ArabicUtility-Klasse verwende, habe ich festgestellt, dass sie die Textwiedergabe besser verbessert als die Farsi-Klasse. https://github.com/agawish/Better-Arabic-Reshaper/commits/master
Bitte beachten Sie, dass Sie keine Schriftarten im Ordner "Assests" installieren müssen und den Schrifttyp dieser Klasse ändern können. Zusätzlich habe ich der obigen Klasse eine neue Methode hinzugefügt, um Text aus Zeichenfolgenfüllungen abzurufen und Text auf Textansichten zu setzen.
Hier ist der Code dafür.
public void addTranslate(int rid, TextView txt1, Context context) { String textv = context.getResources().getString(rid); txt1.setText(ArabicUtilities.reshapeSentence(textv)); }
Wenn Sie die obige Methode in Ihren Aktivitäten verwenden, müssen Sie nur drei Parameter übergeben.
quelle
Versuchen Sie, eine arabische Schriftart in den Assets-Ordner zu kopieren, stellen Sie diese Schriftart ein und überprüfen Sie, ob sie möglicherweise funktioniert
string[] t={"arabic words here"}; TextView tv=(TextView)findViewById(R.id.text); Typeface face=Typeface.createFromAsset(getAssets(), "fonts/HandmadeTypewriter.ttf"); tv.setTypeface(face)
Verwenden Sie die arabische Schriftart HandmadeTypewriter.ttf oder
Versuchen Sie, den statischen arabischen Text einzustellen und seine Funktionsweise zu überprüfen oder nicht?
string[] t={"arabic words here"}; Textview tv=(Textview)findviewByid(R.id.text); tv.setText(t[0]);
quelle
tv.setTypeFace
und stellen Sie den richtigen ttf für das Arabisch einquelle