لماذا يتم عرض ¿ بشكل مختلف في Windows مقابل Linux حتى عند استخدام UTF-8؟

StackOverflow https://stackoverflow.com/questions/176196

  •  05-07-2019
  •  | 
  •  

سؤال

لماذا يتم عرض ما يلي بشكل مختلف في Linux مقابل Windows؟

System.out.println(new String("¿".getBytes("UTF-8"), "UTF-8"));

في ويندوز:

¿

في لينكس:

¿

هل كانت مفيدة؟

المحلول

وSystem.out.println () إخراج النص في ترميز النظام الافتراضي، ولكن وحدة يفسر أن الناتج وفقا لموقعه الترميز الخاصة (أو "مخطط الشفرة"). على آلة ويندوز الخاص بك تبدو ترميزات اثنين للمباراة، ولكن على مربع لينكس الإخراج هو على ما يبدو في UTF-8 في حين أن وحدة التحكم هو فك أنها ترميز بايت واحد مثل ISO-8859-1. أو ربما، كما اقترح جون، يتم حفظ الملف المصدر كما UTF-8 و javac يقرأ على أنه شيء آخر، وهي مشكلة يمكن تجنبها باستخدام يهرب يونيكود.

وعندما كنت في حاجة إلى أي شيء الإخراج الأخرى من نص ASCII، وأفضل رهان هو الكتابة إلى الملف باستخدام الترميز المناسب، ثم قراءة الملف مع محرر النص - لوحات المفاتيح هي محدودة جدا وجدا التي تعتمد على النظام. بالمناسبة، هذا الشيء من التعليمات البرمجية:

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

... له أي تأثير على الإخراج. كل ما يفعله هو تشفير محتويات السلسلة إلى صفيف بايت وترجم ذلك مرة أخرى، إعادة إنتاج السلسلة الأصلية - مكلفة عدم المرجع. إذا كنت ترغب في إخراج النص في ترميز معين، تحتاج إلى استخدام OutputStreamWriter، كما يلي:

FileOutputStream fos = new FileOutputStream("out.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");

نصائح أخرى

ولست متأكدا أين تكمن المشكلة بالضبط، ولكن من الجدير بالذكر أن

و¿ (0xc2،0xbf)

وهو نتيجة لترميز مع UTF-8

و0xbf،

والذي هو التمثيل البرمجي Unicode لل¿

وهكذا، يبدو وكأنه في حالة لينكس، لا يتم عرض الإخراج ك UTF-8، ولكن كسلسلة بايت واحد

وتحقق ما ترميز محطة لينكس الخاص بك لديها.

لجنوم الطرفية في أوبونتو - الذهاب إلى القائمة "الطرفية" وحدد "تعيين ترميز الأحرف"

لالمعجون، تكوين -> نافذة -> الترجمة -> UTF-8 (وإذا لم يفلح ذلك، يرى <وأ href = "http://planetozh.com/blog/2007/08/how-to ، عرض-UTF8-ين--المعجون باش قذيفة / "يختلط =" noreferrer "> هذا المنصب ).

قم بتشغيل هذا الرمز للمساعدة في تحديد ما إذا كانت مشكلة في برنامج التحويل البرمجي أو وحدة التحكم:

public static void main(String[] args) throws Exception {
    String s = "¿";
    printHex(Charset.defaultCharset(), s);

    Charset utf8 = Charset.forName("UTF-8");
    printHex(utf8, s);
}

public static void printHex(Charset encoding, String s)
        throws UnsupportedEncodingException {
    System.out.print(encoding + "\t" + s + "\t");

    byte[] barr = s.getBytes(encoding);
    for (int i = 0; i < barr.length; i++) {
        int n = barr[i] & 0xFF;
        String hex = Integer.toHexString(n);
        if (hex.length() == 1) {
            System.out.print('0');
        }
        System.out.print(hex);
    }
    System.out.println();
}

إذا كانت البايتات المشفرة لـ UTF-8 مختلفة على كل منصة (يجب أن تكون كذلك c2bf)، إنها مشكلة مترجم.

إذا كانت مشكلة مترجم، فاستبدل "¿" بـ "\u00f".

ومن الصعب أن تعرف بالضبط أي بايت يحتوي على شفرة المصدر الخاصة بك، أو سلسلة التي getBytes () يتم دعا، بسبب محرر ومترجم ترميزات.

هل يمكن ان تنتج برنامجا قصيرة ولكن كاملة تحتوي على ASCII فقط (وصلة \ uxxxx الهروب في سلسلة) الذي لا يزال يظهر المشكلة؟

وأظن قد تكون المشكلة بشكل جيد مع وحدة الإخراج على أي ويندوز أو لينكس، ولكن سيكون من الجيد الحصول على برنامج استنساخه أولا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top