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

كيف يتم كتابة باللغة العربية إلى قاعدة بيانات Access

بدأه MKSoft في 22 ديسمبر 2009 · 20 رد · 2,447 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أريد من إخواني ممن لديه تجربة أن يساعدني في كيفية تخزين جملة باللغة العربية مثلا إسم موظف إلى قاعدة بيانات Access , حيث حاولت ذلك لكني لم أنجح .. انظر الصورة .

621305749.jpg

كما تشاهدون قد تم تخزين الإسم العربي في قاعدة البيانات بشكل غريب جدا !!!

فما الحل ؟؟

#2

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

حسب تجربتي في الموضوع فإنه لا مشكلة في حفظ اللغة العربية في الـ Access مباشرة من الجافا باستخدام ODBC Driver و إن ما تراه في الصورة التي أمامك هو النص نفسه و لكن مخزن بترميز UTF-8.. بينما العرض في الـ Access يعتمد على الـ Windows-1256

قد يكمن حل المشكلة في إضافتك لخاصية في الـ Connection تحول وسيلة الاتصال فيه لتخزن بترميز Windows-1256 بدلاً من الافتراضي للجافا و الذي هو UTF-8 و يتم ذلك على النحو التالي:

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Properties props = new Properties();
        props.put("charSet", "windows-1256");
String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/Users/mkhoudary/Documents/ManagementSystem.mdb;";

أرجو منك تجربة هذا الكود و إخباري بالنتيجة..

تحياتي،،

تم تعديل هذه المشاركة بواسطة محمد رياض الخضري في 22 ديسمبر 2009 في 22:17

2
n622971709_461151_8573.jpg
#3

يعطيك العافية يا محمد

على العموم انا جربت طريقتك لكنها لم تغير شيء , لكن هناك شيء لم أفهمه !!! , ماعلاقة انشاء Object من Properties بقاعدة البيانات Access ؟

#4

يااه.. سامحني سقط سهواً أهم و آخر سطر!!

Connection conn = DriverManager.getConnection(database, props);

جرب و أخبرني أرجوك..

و سامحني على هذا الخطأ البشع :blush:

تحياتي،

1
n622971709_461151_8573.jpg
#5

هيك تمام أخي محمد بارك الله فيك ..

لكن بقي التحدي أن أجربه على جهاز اخر ... ولذلك انتظر مني نتائج التجربة

#6

تمام!..

في انتظار النتيجة،

تحياتي،،

n622971709_461151_8573.jpg
#7

البرنامج يا محمد يعمل بنجاح في تخزين النصوص العربية في Access

لكن هناك مشكلة واجهتني عندما قمت بتحويل البرنامج لملف jar واضفت قاعدة البيانات إلى lib الخاص بالبرنامج هو ان البرنامج يقوم بعرض النصوص العربية المخزنة في قاعدة البيانات Access على شكل مربعات في JTable الخاص بالبرنامج أو في أي Component اخر من عناصر البرنامج ....

فما الحل برأي الأخوة الكرام ؟؟

أنظر الصورة

h3ub88zqd.jpg

#8

جرب أن تحول الString الذي تسترجعه من قاعدة البيانات إلى utf-8 قبل إضافته إلى JTable

String str = new String(stringFromDatabase.getBytes("UTF-8"));

تم تعديل هذه المشاركة بواسطة herch في 23 ديسمبر 2009 في 01:54

#9

هل أنت بحاجة إلى عرض قاعدة البيانات من البرنامج ومن الأكسس معاً؟

عندما تقوم بتخزين النصوص في قاعدة بيانات تكون مرمزة بالترميز الافتراضي للأحرف في جافا: utf-8

ولكن Access يستخدم ترميز Windows-1256 لترميز الأحرف العربية

عند خيارين:

الخيار الأول (مستحسن):

إن كنت تريد استخدام البيانات فقط من داخل برنامجك (وليس عن طريق الـ Access) فعندها لا تقم بأي تعديل على كودك الأول.

أي خزن البيانات بترميز utf-8 من برنامجك (والتي ستظهر بشكل خاطئ في Access) وفكك ترميزها على أنها مرمزة بـ utf-8

الخيار الثاني:

أن تقوم بتخزين البيانات بترميز Windows-1256 (بالطريقة التي أشار بها الأخ محمد رياض الخضري) وبالتالي تستطيع عرضها بشكل صحيح من داخل Access

ثم تقوم بتفكيكها على أنها مرمزة باستخدام Windows-1256 ! وهذا ما لم تقم به في كودك !

اقتباس
لكن هناك مشكلة واجهتني عندما قمت بتحويل البرنامج لملف jar واضفت قاعدة البيانات إلى lib الخاص بالبرنامج هو ان البرنامج يقوم بعرض النصوص العربية المخزنة في قاعدة البيانات Access على شكل مربعات في JTable الخاص بالبرنامج أو في أي Component اخر من عناصر البرنامج ....

هل يعمل البرنامج بشكل صحيح من داخل الـ IDE ؟

على كل حال راجع هذا الموضوع:

/index.php?showtopic=209175

وهذا الموضوع:

/index.php?showtopic=209242

تم تعديل هذه المشاركة بواسطة Speed_Of_Light في 23 ديسمبر 2009 في 18:02

#10
herch كتب:

جرب أن تحول الString الذي تسترجعه من قاعدة البيانات إلى utf-8 قبل إضافته إلى JTable

String str = new String(stringFromDatabase.getBytes("UTF-8"));

شكر أخ عصام على التعقيب لكن

لا يوجد أي مشكلة في تنفيذ البرنامج من IDE وهو NetBeans حيث بقوم البرنامج بالعرض بالشكل الجيد ... المشكلة في حال تحويل البرنامج لملف jar , ووضع قاعدة البيانات في مجلد اسمه lib داخل البرنامج !!

لقد جربت طريقتك وهي استخدام الكود التالي :

String str = new String(stringFromDatabase.getBytes("UTF-8"));

لكن للأسف لم تنجح حيث ظهر عندي في JTable تشفير جديد وغريب عن السابق ..

اقتباس
الخيار الثاني:

أن تقوم بتخزين البيانات بترميز Windows-1256 (بالطريقة التي أشار بها الأخ محمد رياض الخضري) وبالتالي تستطيع عرضها بشكل صحيح من داخل Access

ثم تقوم بتفكيكها على أنها مرمزة باستخدام Windows-1256 ! وهذا ما لم تقم به في كودك !

شكرا أخي ..

لكن كيف أقوم بفك التشفير السابق !!؟؟؟ إذا كنت تقصد طريقة الأخ herch او استخدام

new String(value.getBytes(),"UTF-8")

قهذا لم ينجح أيضا ؟؟؟؟

فما هو اقتراحك أخي ؟؟؟

#11

جرب إذن بوضع windows-1256 بدل UTF-8.

ليست لدي أدنى فكرة عن المشكل، وما عندي MS Access حتى أجرب بنفسي :unsure:

#12

هل راجعت الروابط التي أخبرتك عنها ؟!!

استخدم هذه الطريقة:

    String fixMePlease(String s) {
        Charset Win1256 = Charset.forName("windows-1256");
        Charset utf8 = Charset.forName("UTF-8");
        byte b[] = s.getBytes();
        String ss = utf8.decode(Win1256.encode(utf8.decode(ByteBuffer.wrap(b)))).toString();
        return ss;
    }

ولا تنسى استيراد هذين الصفين:

import java.nio.ByteBuffer;
import java.nio.charset.Charset;

واخبرني بالنتيجة

#13
Speed_Of_Light كتب:

هل راجعت الروابط التي أخبرتك عنها ؟!!

استخدم هذه الطريقة:

    String fixMePlease(String s) {
        Charset Win1256 = Charset.forName("windows-1256");
        Charset utf8 = Charset.forName("UTF-8");
        byte b[] = s.getBytes();
        String ss = utf8.decode(Win1256.encode(utf8.decode(ByteBuffer.wrap(b)))).toString();
        return ss;
    }

ولا تنسى استيراد هذين الصفين:

import java.nio.ByteBuffer;
import java.nio.charset.Charset;

واخبرني بالنتيجة

لقد حاولت ذلك أخي الكريم , حيث استخدمت fixMePlease ومررت له الجملة التي اردت إعادة تشفيرها للغة العربية ليتم اظهارها في JTable لكن بقيت نفس المشكلة

#14

المشكلة موجودة فقط عند حزم المشروع على شكل ملف JAR ؟ وهل تظهر عند الاستخدام من داخل الـ IDE ؟

أرنا بعض الكود حتى نتمكن من مساعدتك !

#15
Speed_Of_Light كتب:

المشكلة موجودة فقط عند حزم المشروع على شكل ملف JAR ؟ وهل تظهر عند الاستخدام من داخل الـ IDE ؟

أرنا بعض الكود حتى نتمكن من مساعدتك !

في البداية المشكلة كانت يا أخي فقط بعد أنشاء ملف Jar , لكن بعد استخدامي للطريقة الأخيرة التي اقترحتها أصبحت المشكلة في IDE و في jar .

public class DataManager {

    Connection cnn = null;
    private static Statement stmt = null;
    ResultSet rs = null;
    public DataManager()throws SQLException{
        java.util.Properties prop = new java.util.Properties();
        prop.put("charSet", "windows-1256");
        cnn = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};" +
               "Dbq=lib\\RA_DB2009.mdb",prop );

        stmt = cnn.createStatement();


    }
}

DefaultTableModel dm = new DefaultTableModel();

protected void fillJTable()throws Exception{



         Vector<Employee> emp = newOne.getRow(); //return vector  of Employee objects 
            dm.setNumRows(0);


            for(int i = 0 ; i < emp.size() ; i++){
                Employee newEmp = emp.get(i);

                Object[] obj = {newEmp.getEmpid(),new String(newEmp.getEmparname().getBytes(), "windows-1256"),newEmp.getEmpengname(),newEmp.getEmpjobdesc()};

                dm.addRow(obj);
            }
            rowsNumber_lb.setText(""+dm.getRowCount());

}
#16

السلام عليكم

أهلا بك أخ MKSoft

يسعدنى أساعدك فى حل مشكلتك البسيطة هذه

كل ماعليك هو تغيير خاصية encoding فى بداية كود التطبيق

وليكن فى الفئة الرئيسية Main Class الخاصة بك

جرب هذا المثال

import javax.swing.SwingUtilities;

public class Main {
    public Main() {
        super();
		/**
		*for arabic letters
		*
		*/
        System.setProperty("file.encoding","windows-1256"); 
    }

    public static void main(String[] args) {
        new Main();
        SwingUtilities.invokeLater(new master());
    }
}

لاحظ ال Constructor جيدا

ان شاء الله هذا حل مشكلتك

تقبل مرورى

2


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#17
MOHAMED FATHEI كتب:

السلام عليكم

أهلا بك أخ MKSoft

يسعدنى أساعدك فى حل مشكلتك البسيطة هذه

كل ماعليك هو تغيير خاصية encoding فى بداية كود التطبيق

وليكن فى الفئة الرئيسية Main Class الخاصة بك

جرب هذا المثال

import javax.swing.SwingUtilities;

public class Main {
    public Main() {
        super();
		/**
		*for arabic letters
		*
		*/
        System.setProperty("file.encoding","windows-1256"); 
    }

    public static void main(String[] args) {
        new Main();
        SwingUtilities.invokeLater(new master());
    }
}

لاحظ ال Constructor جيدا

ان شاء الله هذا حل مشكلتك

تقبل مرورى

على الرغم يا محمد أني استخدمت شيئا مماثلا في البرنامج و هو استخدام الترميز الخاص بـ windows لكن لم ينجح الأمر ,

لكن طريقتك يا محمد إلى الان تعمل بنجاح كامل , و لا أدري التفسير الحقيقي لذلك , لكن مازال هناك تحدي و هو يجب تجربته على بعض الأجهزة الأخرى لأرى النتائج !!

تقبل تحياتي يا محمد .

#18

حقيقة بعد تجربتي على جهاز اخر , لقد نجح الترميز بدرجة كبيرة جدا

بارك الله فيك يا محمد .

#19

السلام عليكم

جرب تشغيل البرنامج كالتالي :

java -jar -Dfile.encoding="UTF-8" MyApp.jar

او

java -jar -Dfile.encoding="windows1256" MyApp.jar
#20

الامور التي قد تكون مشوشة للبعض

انه في النت بينز عند عمل مشروع فيه فأنه يخصص بعض خوائص البرنامج

مثل

post-111465-12621823886283_thumb.gif

و عند تشغيل البرنامج من النت بينز فأن هذه الخوائص تتطبق على البرنامج و ذلك بسبب استخدامه Apache Ant لتشغيل البرنامج

و لكن عند ضنع ملف Jar او تنفيذي فأن هذه الخوائص لا ترحّل للبرنامج مما يتوجب اضافتها بنفسك

مثل

java -jar -Dfile.encoding="UTF-8" MyApp.jar

و هنا صورتين الاولى في النت بينز

و الثانية من cmd

post-111465-1262183029102_thumb.gifpost-111465-12621830374216_thumb.gif

قد تلاحظ بعض الفروق بنهم

مثلا في الاولى

file.encoding=UTF-8

الثانية

file.encoding=Cp1252

تم تعديل هذه المشاركة بواسطة Mohammed Mshari Ersan في 30 ديسمبر 2009 في 17:25

1
#21

لا شكر على واجب أخى MKSoft

المسألة بسيطة ولا تستحق الشكر

تحياتى


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…