java - تاريخ - دوال string في لغة الجافا pdf



أوتف-8 ترميز الأحرف في جافا (3)

أواجه بعض المشاكل في الحصول على بعض النص الفرنسي لتحويل UTF8 بحيث يمكن عرضها بشكل صحيح، إما في وحدة تحكم أو ملف نصي أو عنصر واجهة المستخدم الرسومية.

السلسلة الأصلية هي

HANDICAP╔ES

الذي يفترض أن يكون

HANDICAPÉES

في ما يلي مقتطف الشفرة الذي يظهر كيف أستخدم برنامج تشغيل قاعدة البيانات جاكسيس لقراءة في ملف أكسيس مدب في بيئة إكليبس / لينوكس.

Database database = Database.open(new File(filepath));
Table table = database.getTable(tableName, true);
Iterator rowIter = table.iterator();
while (rowIter.hasNext()) {
    Map<String, Object> row = this.rowIter.next();
    // convert fields to UTF
    Map<String, Object> rowUTF = new HashMap<String, Object>();
    try {
        for (String key : row.keySet()) {
            Object o = row.get(key);
            if (o != null) {
                String valueCP850 = o.toString();
                // String nameUTF8 = new String(valueCP850.getBytes("CP850"), "UTF8"); // does not work!
                String valueISO = new String(valueCP850.getBytes("CP850"), "ISO-8859-1");
                String valueUTF8 = new String(valueISO.getBytes(), "UTF-8"); // works!
                rowUTF.put(key, valueUTF8);
            }
        }
    } catch (UnsupportedEncodingException e) {
        System.err.println("Encoding exception: " + e);
    }   
}

في رمز سترى أين أريد أن تحويل مباشرة إلى UTF8، الذي لا يبدو للعمل، لذلك لا بد لي من القيام تحويل مزدوج. لاحظ أيضا أنه لا يبدو أن هناك طريقة لتحديد نوع الترميز عند استخدام برنامج تشغيل جاكسيس.

شكرا، كام


Answer #1

وساعدني استخدام " إسو-8859-1 " في التعامل مع الشارات الفرنسية.


Answer #2

يمكنك تحديد ترميز عند إنشاء اتصال. وكانت هذه الطريقة مثالية وحل مشكلة ترميز بلدي:

    DatabaseImpl open = DatabaseImpl.open(new File("main.mdb"), true, null, Database.DEFAULT_AUTO_SYNC, java.nio.charset.Charset.availableCharsets().get("windows-1251"), null, null);
    Table table = open.getTable("FolderInfo");

Answer #3
String s = "HANDICAP╔ES";
System.out.println(new String(s.getBytes("CP850"), "ISO-8859-1")); // HANDICAPÉES

يوضح هذا قيمة السلسلة الصحيحة. وهذا يعني أنه تم ترميز في الأصل / فك الشفرة مع إسو-8859-1 ومن ثم مشفرة بشكل غير صحيح مع CP850 (أصلا CP1252 ويعرف أيضا باسم أنسي كما هو موضح في التعليق هو في الواقع ممكن أيضا منذ É لديه نفس كوديبوانت هناك كما هو الحال في إسو-8859- 1).

محاذاة البيئة وخطوط الأنابيب الثنائية لاستخدام كل واحد ونفس ترميز الأحرف. لا يمكنك ولا يجب تحويل بينهما. سوف تخاطر بفقدان المعلومات في نطاق غير أسي بهذه الطريقة.

ملاحظة: لا تستخدم مقتطف الشفرة أعلاه إلى "إصلاح" المشكلة! وهذا لن يكون الحل الصحيح.

تحديث : كنت على ما يبدو لا تزال تكافح مع المشكلة. سوف أكرر الأجزاء الهامة من الجواب:

  1. محاذاة البيئة وخطوط الأنابيب الثنائية لاستخدام كل واحد ونفس ترميز الأحرف.

  2. لا يمكنك ولا يجب تحويل بينهما. سوف تخاطر بفقدان المعلومات في نطاق غير أسي بهذه الطريقة.

  3. لا تستخدم مقتطف الشفرة أعلاه إلى "إصلاح" المشكلة! وهذا لن يكون الحل الصحيح .

لإصلاح المشكلة تحتاج إلى اختيار حرف ترميز X التي ترغب في استخدامها في جميع أنحاء التطبيق بأكمله. أقترح UTF-8 . تحديث مس أسيس لاستخدام الترميز X. تحديث بيئة التطوير الخاص بك لاستخدام الترميز X. تحديث القراء java.io والكتاب في التعليمات البرمجية الخاصة بك لاستخدام الترميز X. تحديث محرر لقراءة / كتابة الملفات مع ترميز X. تحديث واجهة المستخدم التطبيق لاستخدام الترميز X. لا تستخدم Y أو Z أو أيا كان في بعض الخطوة. إذا كانت الأحرف معطوبة بالفعل في بعض مخزن البيانات (مس أسيس، الملفات، الخ)، فأنت بحاجة إلى إصلاحه يدويا عن طريق استبدال الأحرف الموجودة هناك في مخزن البيانات. لا تستخدم جافا لهذا الغرض.

إذا كنت تستخدم فعلا "موجه الأوامر" كواجهة مستخدم، فستفقد فعليا. وهو لا يدعم أوتف-8. كما اقترح في التعليقات وفي المقالة المرتبطة في التعليقات، تحتاج إلى إنشاء تطبيق سوينغ بدلا من الاعتماد على بيئة موجه الأوامر المقيدة.





character-encoding