الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Api للتحويل من نص عربي او انجليزي ال Unicode

رائج
بدأه .S.T.A.L.K.E.R في 15 سبتمبر 2009 · 72 رد · 7,901 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

صنعت هذه الاداة للمساعدة للتحويل الى unicode string

مثال:

import com.mosh.Unicode;

  String strUnicode = Unicode.encode("محمد عرسان");
  System.out.println(strUnicode);

"\u0645\u062D\u0645\u062F20\u0639\u0631\u0633\u0627\u0646"

و يمكن اعادة التركيب كالتالي :

String s=Unicode.decode("\u0645\u062D\u0645\u062F20\u0639\u0631\u0633\u0627\u0646");

ليعود النص كما كان

محمد عرسان

:)

تحياتي

للتحميل

تم حذف المكتبة و استبدالها بالجديدة

التحديث الاخير --->(27-7-2010) Unicode.jar

تعديل عالكود

الكود :

package com.mosh;

/**
 * 
 * @author MErsan
 */
public class Unicode {

    private final static char[] digits = {
        '0', '1', '2', '3', '4', '5',
        '6', '7', '8', '9', 'a', 'b',
        'c', 'd', 'e', 'f'
    };

    public static String decode(String s) {
        if (s == null || s.length() <= 0) {
            return null;
        }
        String[] strings = s.split("\\\\");
        StringBuilder result = new StringBuilder(strings.length);
        for (String h : strings) {
            if (h != null && h.length() >= 5 && h.startsWith("u")) {
                result.append((char) Integer.parseInt(h.substring(1, 5), 16));
                if (h.length() > 5) {
                    result.append(h.substring(5, h.length()));
                }
            } else {
                result.append(h);
            }
        }
        return result.toString();
    }

    public static String encode(String text) {
        if (text == null || text.length() <= 0) {
            return null;
        }
        int textLen = text.length();
        StringBuilder buffer = new StringBuilder(textLen * 4);
        for (int i = 0; i < textLen; i++) {
            char c = text.charAt(i);
            if (c < 32 || c > 126) {
                buffer.append(toUnsignedString(text.charAt(i)));
            } else {
                buffer.append(c);
            }
        }
        return buffer.toString();
    }
    final static int shift = 4;
    final static int mask = 15;

    public static String toUnsignedString(int i) {
        char[] buf = {'\\', 'u', '0', '0', '0', '0'};
        int charPos = 6;


        do {
            buf[--charPos] = digits[i & mask];
            i >>>= shift;
        } while (i != 0);
        return new String(buf);
    }
}

تم تعديل هذه المشاركة بواسطة محمد عرسان في 27 يوليو 2010 في 17:57

1
#2

شكرا يا أستاذ محمد، لكن ممكن تضع الكود حتى تعم الفائدة :wink:

#3

ولا يهمك يا عصام

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package unicode;

public class Unicode {

    public Unicode() {
    }

    private static char characterDigit(int v) {
        String symbs = "0123456789ABCDEF";
        return symbs.charAt(v & 0xf);
    }

    private static String characterHexaValue(int v) {
        String s = "";
        s += characterDigit(v >> 12);
        s += characterDigit(v >> 8);
        s += characterDigit(v >> 4);
        s += characterDigit(v);
        return s;
    }

    private static String characterString(int val) {
        if (val == 10) {
            return "\\n";
        }
        if (val == 13) {
            return "\\r";
        }
        if (val == 92) {
            return "\\\\";
        }
        if (val == 34) {
            return "\\\"";
        }
        if (val < 32 || val > 126) {
            return "\\u" + characterHexaValue(val);
        } else {
            return (char) val + ("");
        }
    }

    private static String accumulate(String value) {
        String resultString = "";
        for (int index = 0; index < value.length(); index++) {
            int chr = value.charAt(index);
            resultString += characterString(chr);
        }

        return resultString;
    }

    public static String encode(String value) {
        return accumulate(value);
    }

    public static String decode(String value) {
        StringBuilder result = new StringBuilder();
        if (value.contains("\\u")) {
            String[] valueArray = value.split("\\\\u");
            for (String s : valueArray) {
                if (s.length() == 4) {
                    try {
                        System.out.println(s);
                        result.append((char) Integer.parseInt(s, 16));
                    } catch (NumberFormatException e) {
                        result.append(s);
                        continue;
                    }
                } else {
                    result.append(s);
                }
            }
            return result.toString();
        }
        return value;
    }
}

تم تعديل هذه المشاركة بواسطة محمد عرسان في 21 يوليو 2010 في 05:31

#4

ما هذا يا أستاذ محمد، bitwise operation :wacko:

احنا صايمين وأنا عندي نقص في الكافيين حرام عليك :haha:

سبق أن كنت عملت نفس الشيء لكني لم أستعمل طريقتك، وإنما استعملت ميثود توجد في الكلاس String وهي codePointAt، هذه الميثود تعطيها index الحرف الذي تريد معرفة الكود يونيكود الخاص به وهي تعيد لك الكود، بالdecimal وليس بالhexadecimal

ممكن تشرح لنا الطريقة التي استعملتها، لاني لم أفهمها جيدا :blink:

تم تعديل هذه المشاركة بواسطة herch في 15 سبتمبر 2009 في 18:56

#5

يعني موش أنا لوحدي اللي عندي حساسيه من ال bitwise operations :lol:

#6

إذا كنتم تقصدون هذه الدالة

	private static String characterHexaValue(int v) {
		String s = "";
		s += characterDigit(v >> 12);
		s += characterDigit(v >> 8);
		s += characterDigit(v >> 4);
		s += characterDigit(v);
		return s;
	}

فالأمر بسيط

القيمة للحروف تتكون من 16 خانة في النظام الثنائي وأربع خانات في النظام السادسعشري

محمد استخدام عملية انقل إلى اليمين shift right

لكي يحص لعى كل خانة من الخانات الأربع على حدة

والتي تكون كالتالي

مثلاً العدد c=1100

لوقلنا

c>>2

فالناتج سيساوي 11 أي 3 بالنظام العشري

نلاحظ محمد قام بعملية النقل أول مرة 12 فحصل على الخانة الأولى

ثم قام البنقل على 8 فحصل على الخانتين لكنه في الدالة characterDigit عمل عملية & مع الرقم 0f

فحصل على الخانة الثانية بدون الخانة الأولى

ثم قام بالنقل إلى اليمين 4 خانات فحصل على الثلاث خانات الأواخر

لكنه في الدالة characterDigit عمل عملية & مع الرقم 0f

فحصل على الخانة الثالثة بدون الخانتين الأولى والثانية

ثم أخذ العدد كاملاً لكنه باستخدام الدالة characterDigit عمل عملية & مع الرقم 0f

فحصل على الخانة الرابعة بدون الخانتين الثلاث الأول

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#7

:wacko: :wacko: :wacko:

دائما الbitwise operations تسبب لي دوخة :lol:

#8

بأمانة الموضوع ليس بالسهل

على كل أي أسئلة أنا جاهز

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#9

:blink: :(

ممكن تشير لنا على مكان نتعلم منه الأستاذ bitwise و الحاجه اللي هنحتاج نفهما, هنرجعلك

#10

بأمانة لا أعرف مكان يهتم بهذه الأمور

لكني سأحاول أن أكتب درس بسيط يتعلق بالموضوع

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#12

الاخ علاء : ننتظر ذلك على أحر من الجمر, جزاك الله خيرا

الأخ خالد: جزاك الله خيرا

#13

شكرا جزيلا على هذا الصنف ....

#14

جزاك الله خيرا ، لقد أفدتني وأسعدتني كثيرا بهذه الأداة ، ولكن سعادتني لم تكتمل ، حيث أنك لم تكمل الدالة decode(String value) ، وقد تفاجأت بذلك بعد استخدام الأداة في أحد مشاريعي ، وعندما نظرت في المصدر وجدتها فعلا كذلك ،

فحبذا لو أكملتها ، وجزاك الله خيرا .

300_130.gif

#15

ربما سيكون من الجيد لو أكملتها أنت أخ rohaili

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#16

الى الذين يرغبون باستخدامها

لقد قمت ببعض التعديلات على الكود

الدالة التي تعيد تركيب النص اصبحت كالتالي :

public static String decode(String value) {
        StringBuilder result = new StringBuilder();
        if (value.contains("\\u")) {
            String[] valueArray = value.split("\\\\u");
            for (String s : valueArray) {
                if (s.length() == 4) {
                    try {
                        System.out.println(s);
                        result.append((char) Integer.parseInt(s, 16));
                    } catch (NumberFormatException e) {
                        result.append(s);
                        continue;
                    }
                } else {
                    result.append(s);
                }
            }
            return result.toString();
        }
        return value;
    }
1
#17

شكرا لك اخي محمد ...

اضافة مفيدة جدا لهذا الصنف.

#18

ما رأيك أن تعيد رفعها مرة أخرى يا محمد بعد التعديل

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#19

بالفعل

قممت رفعها بنفس الموضوع في المشاركة الاولى

و هذا هو الرابط

Unicode Lib Download

تم تعديل هذه المشاركة بواسطة محمد عرسان في 21 يوليو 2010 في 17:58

1
#20

لا أدري لم كل هذا التعقيد والكود الطويل في encode !!

يمكنك اختصارها إلى بضع أسطر ليصبح البرانامج:

package unicode;
public class Unicode {

    public static final String u = "\\u";
    public static final String slashU = "\\\\u";

    public static String encode(String value) {
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < value.length(); i++) {
            result.append(u);
            result.append(String.format("%04X", (int) value.charAt(i)));
        }
        return result.toString();
    }

    public static String decode(String value) {
        StringBuilder result = new StringBuilder();
        if (value.contains(u)) {
            String[] valueArray = value.split(slashU);
            for (String s : valueArray) {
                if (s.length() == 4) {
                    try {
                        result.append((char) Integer.parseInt(s, 16));
                    } catch (NumberFormatException e) {
                        result.append(s);
                        continue;
                    }
                } else {
                    result.append(s);
                }
            }
            return result.toString();
        }
        return value;
    }
}
#21

أعتقد أن محمد عرسان قام بكتابة الكود بنفسه بينما أنت إستخدمت دوال جاهزه....... و هو بكل الأحوال تدريب جيد لمحمد عرسان :P

#22

نعم صحيح، لكن طريقته ستؤدي إلى كارثة في تجزئة الذاكرة إذا تم استخدامها في "البرامج الحقيقية"

لاحظ :

    private static String characterHexaValue(int v) {
        String s = "";
        s += characterDigit(v >> 12);
        s += characterDigit(v >> 8);
        s += characterDigit(v >> 4);
        s += characterDigit(v);
        return s;
    }

وكما تعلم أن الـ String غير قابلة للتغيير immutable أي سيتم إنشاء عدد هائل من الـ Strings !

كما أنها تحوي bug بالنسبة للمسافة الفارغة space (هل يوجد غيرها ؟ :lol: )

أحب الإشارة إلى أنه يمكن استخدام Integer.toHexString بدلاً من String.format (لكن بذلك لن تحصل على تراميز Unicode ممتدة على أربع أرقام Capital)

وستحتاج بالطبع إلى حذف التحقق من طول الرمز في decode

أي يصبح الكود:

package unicode;
public class Unicode {

    public static final String u = "\\u";
    public static final String slashU = "\\\\u";

    public static String encode(String value) {
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < value.length(); i++) {
            result.append(u);
            //result.append(String.format("%04X", (int) value.charAt(i)));
            result.append(Integer.toHexString(value.charAt(i)));
        }
        return result.toString();
    }

    public static String decode(String value) {
        StringBuilder result = new StringBuilder();
        if (value.contains(u)) {
            String[] valueArray = value.split(slashU);
            for (String s : valueArray) {
                    try {
                        result.append((char) Integer.parseInt(s, 16));
                    } catch (NumberFormatException e) {
                        result.append(s);
                        continue;
                    }
            }
            return result.toString();
        }
        return value;
    }
}
#23
اقتباس
وكما تعلم أن الـ String غير قابلة للتغيير immutable أي سيتم إنشاء عدد هائل من الـ Strings !

عند عمل compile فانه يتم تحويل ال String الى StringBuilder والذي هو Mutable (للعلم فقط)

اقتباس
كما أنها تحوي bug بالنسبة للمسافة الفارغة space (هل يوجد غيرها ؟ )

لم اجدها!!! ارجو وضع مثال للBug

حاولت فيها وكانت النتيجة كالتالي:

        System.out.println(Unicode.encode("الفريق   العربي"));
        System.out.println(Unicode.decode("\u0627\u0644\u0641\u0631\u064A\u0642   \u0627\u0644\u0639\u0631\u0628\u064A"));

\u0627\u0644\u0641\u0631\u064A\u0642   \u0627\u0644\u0639\u0631\u0628\u064A
الفريق   العربي
اقتباس
String.format

دالة توجد فقط ب JDK 1.5 و فوق

اقتباس
Integer.toHexString

لم استخدمها و ذلك لانها لا تعرض النص بترميز Unicode و الذي هو يبدأ ب u\ و يمتد باربع احرف اخرى

ولذلك فائدة و هي يمكنك استخدام النص في برنامج كان

ويب و موبايل و ديسكتوب ...

و بالاعتماد علىSUN Conventions 

    public static final String u = "\\u";
    public static final String slashU = "\\\\u";

يجب ان تكون كالتالي:

    public static final String U = "\\u";
    public static final String SLASH_U = "\\\\u";
#24

ممكن حاجه زي كده؟

public class Xyz {

	static final char digits[] = {'0', '1', '2', '3','4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

	public static void main(String[] args) {
		String name = "محمد هويدي";
		for (char ch : name.toCharArray())
			if (Character.isWhitespace(ch))
				System.out.print(ch);
			else
				System.out.print("\\u" + getHex(ch));
	}
	public static String getHex(int ch) {
		char tmp[] = new char[32];
		int i, j, count =0;

		for (i=0; i<32; i++)
			tmp = '0';
		while (ch>0)
		{
			int t = ch&0xf;
			ch>>=4;
			tmp[count++] = digits[t];
		}
		char ret[] = new char[count +=(4-count&3)];	// make ret size to be multiple of four

		for (i=count-1, j=0; i>=0; i--, j++)
			ret[j] = tmp;

		tmp = null;
		return new String(ret);
	}
}

بالنسبة لموضوع الماسافات,, فإن الأداة التي تدعى native2ascii والتي تاتي مع ال JDK تفعل تماما مثلما يفعل محمد عرسان,, فإنه تطبع الماسفات كما هي....

#25

another one

/**
 *
 * @author MErsan
 */
public class Unicode2 {

    private final static char[] digits = {
        '0', '1', '2', '3', '4', '5',
        '6', '7', '8', '9', 'a', 'b',
        'c', 'd', 'e', 'f'
    };

    public static String decode(String s) {
        StringBuilder result = new StringBuilder();
        String[] strings = s.split("\\\\u");
        for (String h : strings) {
            if (h != null && h.length() > 0) {
                result.append((char) Integer.parseInt(h, 16));
            }
        }
        return result.toString();
    }

    public static String encode(String text) {
        StringBuilder buffer = new StringBuilder();
        for (int i = 0; i < text.length(); i++) {
            buffer.append(toUnsignedString(text.charAt(i)));
        }
        return buffer.toString();
    }

    private static String toUnsignedString(int i) {
        char[] buf = {'\\', 'u', '0', '0', '0', '0'};
        int charPos = 6;
        int shift = 4;
        int mask = 15;
        do {
            buf[--charPos] = digits[i & mask];
            i >>>= shift;
        } while (i != 0);
        return new String(buf);
    }
}

please test it

مواضيع مشابهة