Как поддерживать арабский текст в Android?

Я получаю арабский текст с сервера успешно. Извлеченный текст я хочу отобразить в коде, но его показывать поля вместо арабского текста. Предположим, что t значения массива-это арабский текст с сервера.

string[] t={" "};
Textview tv = (Textview) findviewByid(R.id.text);
tv.setText(t[0]);

4 ответов


Android 2.1 не имеет арабского шрифта.

Android 2.2 имеет арабский шрифт, но не показывает ваше слово правильно.

Android 3.x полностью поддерживает арабский язык.

для Android 2.1 вы должны установить шрифт Farsi.GetFarsiFont(this) и затем использовать Farsi.Convert("سلام")

для Android 2.2 вам не нужно устанавливать шрифт, но вы должны использовать Farsi.Convert("سلام")

и для Android 3.х забыть все вышеперечисленные решения ;). Но вы можете изменить шрифт, если вам не нравится 3.икс Арабский шрифт.

так сделайте следующие шаги:

1) сначала добавить "Тахома.TTF " в папке assets

2) используйте следующий класс, чтобы получить шрифт и преобразовать арабский или фарси текст в хорошую форму для отображения в вашей деятельности.

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) и в вашей деятельности:

Typeface tf = Farsi.GetFarsiFont(this);
MyTextView.setTypeface(tf);
MyTextView.setText(Farsi.Convert("سلام"));

наслаждайтесь!

моя ссылка для класса фарси: Arabizer


Я хотел бы добавить свой опыт после нескольких недель борьбы с арабским языком, на самом деле этот пост был очень полезен мне, когда я использую арабские шрифты в своем приложении для android.

я использовал класс фарси в rearrang текст. Но это не соответствует моим ожиданиям. потому что клиент всегда слишком много рассматривает каждую букву приложения, и это аранжировка.

в классе farsi одна из проблем заключается в том, что он не может правильно переставить закрывающие скобки. Как я заметил несколько вопросов.

однако, когда я использую класс ArabicUtility, я заметил, что он улучшил рендеринг текста лучше, чем класс Farsi. https://github.com/agawish/Better-Arabic-Reshaper/commits/master

пожалуйста, не нужно устанавливать шрифты в папку assests, и вы можете изменить тип шрифта из этого класса. Кроме того, я добавил новый метод в класс выше, чтобы получить текст из строковых заполнений и набора текста в textviews.

здесь код для этого.

public void addTranslate(int rid, TextView txt1, Context context) {
        String textv = context.getResources().getString(rid);
        txt1.setText(ArabicUtilities.reshapeSentence(textv));


    }

используя вышеуказанный метод в вашей деятельности, вы просто должны пройти три вышеуказанные параметры.


попробуйте скопировать любой арабский шрифт в папку assets и установить этот шрифт и проверить, может ли он работать

string[] t={"arabic words here"};
TextView tv=(TextView)findViewById(R.id.text); 
Typeface face=Typeface.createFromAsset(getAssets(), "fonts/HandmadeTypewriter.ttf");
tv.setTypeface(face)

используйте арабский шрифт вместо HandmadeTypewriter.шрифт ttf или

попробуйте установить статический арабский текст и проверить его работает или нет ?

string[] t={"arabic words here"};
Textview tv=(Textview)findviewByid(R.id.text);
tv.setText(t[0]);

tv.setTypeFace и установите правильный ttf для арабского