9

RTLテキストを正しく表示する方法についてWebサイトで検索しているときに、 ICUライブラリに関するこの投稿を見つけました。実際、使用方法についてこれまでの経験はありません。そして、明確なオンライン リソースはほとんどありません。

ここにいる人で、以前に使用した経験がある人はいますか? または、少なくとも、欲しいものを得るために何を検索しなければならないか教えてください。

4

2 に答える 2

3

こんにちはAdham私はICU4Jの経験がほとんどありません。LTRアラビア語のテキストを読んでRTLテキストに変換しようとしていました。数字を英語からアラビア数字に変更し、配置をRTLに設定しました。これは私が望む仕事をする簡単なコードです。私の小さな経験があなたを助けましたこれはICU4Jサイトのデモです

        PdfReader reader = new PdfReader(INPUTFILE);


        String txt=PdfTextExtractor.getTextFromPage(reader, 1);

        BiDiClass bidiClass = new BiDiClass();

        String arabicNumber = bidiClass.englishToArabicNumber(txt);

        String out=bidiClass.makeLineLogicalOrder(arabicNumber, true);


        System.out.println(out);

これはBiDiClassです

import com.ibm.icu.text.Bidi;
 import com.ibm.icu.text.Normalizer;


//Editor : Ibraheem Osama Mohamed



/**
 * This class is an implementation the the ICU4J class. TextNormalize
 * will call this only if the ICU4J library exists in the classpath.
 * @author <a href="mailto:carrier@digital-evidence.org">Brian Carrier</a>
 * @version $Revision: 1.0 $
 */
public class BiDiClass {


    private static final String REPLACE_CHARS = "0123456789.";
    private Bidi bidi;




    private StringBuilder sb = new StringBuilder();

    /**
     * Constructor.
     */
    public BiDiClass()
    {
        bidi = new Bidi();

        /* We do not use bidi.setInverse() because that uses
         * Bidi.REORDER_INVERSE_NUMBERS_AS_L, which caused problems
         * in some test files. For example, a file had a line of:
         * 0 1 / ARABIC
         * and the 0 and 1 were reversed in the end result. 
         * REORDER_INVERSE_LIKE_DIRECT is the inverse Bidi mode
         * that more closely reflects the Unicode spec.
         */
        bidi.setReorderingMode(Bidi.REORDER_INVERSE_LIKE_DIRECT);
    }

   /**
     * Takes a line of text in presentation order and converts it to logical order.
     * @see TextNormalize.makeLineLogicalOrder(String, boolean)    
     * 
     * @param str String to convert
     * @param isRtlDominant RTL (right-to-left) will be the dominant text direction
     * @return The converted string
     */
    public String makeLineLogicalOrder(String str, boolean isRtlDominant)
    {   
        bidi.setPara(str, isRtlDominant?Bidi.RTL:Bidi.LTR, null);

        /* Set the mirror flag so that parentheses and other mirror symbols
         * are properly reversed, when needed.  With this removed, lines
         * such as (CBA) in the PDF file will come out like )ABC( in logical
         * order.
         */
        return bidi.writeReordered(Bidi.DO_MIRRORING);
    }

  //algorithm to change form English number to Arabic number
    public String englishToArabicNumber(String string){

        char[] ch=string.toCharArray();

        for (char c : ch) {
             if (REPLACE_CHARS.contains(String.valueOf(c))) {

                   c = (char) ('\u0660' - '0' + c);

             }
             sb.append(c);
          }


        return sb.toString();
    }


    /**
     * Normalize presentation forms of characters to the separate parts.
     * @see TextNormalize.normalizePres(String)
     *
     * @param str String to normalize
     * @return Normalized form
     */
    public String normalizePres(String str)
    {
        StringBuilder builder = null;
        int p = 0;
        int q = 0;
        int strLength = str.length();
        for (; q < strLength; q++) /* >>>*/
        {
            // We only normalize if the codepoint is in a given range.
            // Otherwise, NFKC converts too many things that would cause
            // confusion. For example, it converts the micro symbol in
            // extended Latin to the value in the Greek script. We normalize
            // the Unicode Alphabetic and Arabic A&B Presentation forms.
            char c = str.charAt(q);
            if ((0xFB00 <= c && c <= 0xFDFF) || (0xFE70 <= c && c <= 0xFEFF))/* >>>*/
            {
                if (builder == null) {
                    builder = new StringBuilder(strLength * 2);
                }
                builder.append(str.substring(p, q));
                // Some fonts map U+FDF2 differently than the Unicode spec.
                // They add an extra U+0627 character to compensate.
                // This removes the extra character for those fonts.
                if(c == 0xFDF2 && q > 0 && (str.charAt(q-1) == 0x0627 ||     str.charAt(q-1) == 0xFE8D))
                {
                    builder.append("\u0644\u0644\u0647");
                }
                else
                {
                    // Trim because some decompositions have an extra space,
                    // such as U+FC5E
                    builder.append(
                            Normalizer.normalize(c, Normalizer.NFKC).trim());
                }
                p = q + 1;
            }
        }
        if (builder == null) {
            return str;
        } else {
            builder.append(str.substring(p, q));
            return builder.toString();
        }
    }



    /**
     * Decomposes Diacritic characters to their combining forms.
     *
     * @param str String to be Normalized
     * @return A Normalized String
     */     
    public String normalizeDiac(String str)
    {
        StringBuilder retStr = new StringBuilder();
        int strLength = str.length();
        for (int i = 0; i < strLength; i++) /* >>>*/
        {
            char c = str.charAt(i);
            if(Character.getType(c) == Character.NON_SPACING_MARK
                    || Character.getType(c) == Character.MODIFIER_SYMBOL
                    || Character.getType(c) == Character.MODIFIER_LETTER)
            {
                /*
                 * Trim because some decompositions have an extra space, such as
                 * U+00B4
                 */
                retStr.append(Normalizer.normalize(c, Normalizer.NFKC).trim());
            }
            else
            {
                retStr.append(str.charAt(i));
            }
        }
        return retStr.toString();
    }

      }
于 2012-07-31T01:42:19.430 に答える
1

Android N はICU4J Android フレームワーク APIを提供するようになりました

Android N は、com.ibm.icu ではなく、android.icu パッケージを介して ICU4J API のサブセットを公開します。Android フレームワークは、さまざまな理由で ICU4J API を公開しないことを選択する場合があります。

注意すべきいくつかの重要な点を次に示します。

  1. ICU4J Android フレームワーク API には、すべての ICU4J API が含まれているわけではありません。
  2. NDK 開発者は、Android ICU4C がサポートされていないことを知っておく必要があります。
  3. Android フレームワークの API は、Android のローカライズ サポートをリソースに置き換えるものではありません。
于 2016-03-10T09:51:49.747 に答える