java جافا، أوتف-8، وحدة تحكم ويندوز




windows utf-8 (4)

نحن نحاول استخدام جافا و أوتف-8 على ويندوز. تطبيق يكتب السجلات على وحدة التحكم، ونود أن استخدام أوتف-8 للسجلات كما طلبنا قد تدويل السجلات.

فمن الممكن لتكوين جفم لذلك يولد أوتف-8، وذلك باستخدام -Dfile.encoding=UTF-8 كما الحجج ل جفم. يعمل بشكل جيد، ولكن الإخراج على وحدة تحكم ويندوز هو مشوه.

ثم، يمكننا تعيين صفحة التعليمات البرمجية وحدة التحكم إلى 65001 ( chcp 65001 )، ولكن في هذه الحالة، لا تعمل الملفات. chcp 65001 . وهذا يعني أنه عندما نحاول إطلاق التطبيق لدينا من خلال البرنامج النصي (اسمه start.bat)، لا شيء يحدث على الاطلاق. الأمر بسيط يعود:

C:\Application> chcp 65001
Activated code page: 65001
C:\Application> start.bat

C:\Application>

ولكن من دون chcp 65001 ، لا توجد مشكلة، ويمكن إطلاق التطبيق.

أي تلميحات حول ذلك؟


جرب chcp 65001 && start.bat


جافا على ويندوز لا يدعم ونيكود أوبوت بشكل افتراضي. لقد كتبت طريقة الحل البديل من خلال استدعاء أبي الأصلي مع مكتبة جنا. ستدعو الطريقة وريتيكونسولو الإخراج ونيكود على وحدة التحكم.

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.StdCallLibrary;

/** For unicode output on windows platform
 * @author Sandy_Yin
 * 
 */
public class Console {
    private static Kernel32 INSTANCE = null;

    public interface Kernel32 extends StdCallLibrary {
        public Pointer GetStdHandle(int nStdHandle);

        public boolean WriteConsoleW(Pointer hConsoleOutput, char[] lpBuffer,
                int nNumberOfCharsToWrite,
                IntByReference lpNumberOfCharsWritten, Pointer lpReserved);
    }

    static {
        String os = System.getProperty("os.name").toLowerCase();
        if (os.startsWith("win")) {
            INSTANCE = (Kernel32) Native
                    .loadLibrary("kernel32", Kernel32.class);
        }
    }

    public static void println(String message) {
        boolean successful = false;
        if (INSTANCE != null) {
            Pointer handle = INSTANCE.GetStdHandle(-11);
            char[] buffer = message.toCharArray();
            IntByReference lpNumberOfCharsWritten = new IntByReference();
            successful = INSTANCE.WriteConsoleW(handle, buffer, buffer.length,
                    lpNumberOfCharsWritten, null);
            if(successful){
                System.out.println();
            }
        }
        if (!successful) {
            System.out.println(message);
        }
    }
}

هل حاولت بويرشيل بدلا من cmd.exe القديمة.


كان لدينا بعض المشاكل المماثلة في لينكس. كان لدينا رمز في إسو-8859-1 (في الغالب كب-1252 متوافق) ولكن وحدة التحكم كان أوتف-8، مما يجعل التعليمات البرمجية لعدم تجميع. ببساطة تغيير وحدة التحكم إلى إسو-8859-1 من شأنه أن يجعل بناء السيناريو، في أوتف-8، لكسر. لقد وجدنا خيارين:
1-تحديد بعض الترميز القياسية ولزجة لذلك. وهذا هو خيارنا. نختار للحفاظ على كل شيء في إسو-8859-1، تعديل البرامج النصية بناء.
2-وضع الترميز قبل بدء أي مهمة، حتى داخل بناء البرامج النصية. بعض التعليمات البرمجية مثل إريكسون قال. في لينكس كان مثل:

lang=pt_BR.ISO-8859-1 /usr/local/xxxx

كسوف بلدي لا يزال مثل هذا. كلاهما يعمل بشكل جيد.







console