سؤال

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

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

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

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

C:\Application>

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

أي تلميحات عن ذلك ؟

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

المحلول

محاولة chcp 65001 && start.bat

نصائح أخرى

جافا ويندوز لا يدعم unicode ouput بشكل افتراضي.كنت قد كتبت الحل طريقة عن طريق استدعاء API الأصلي مع الجيش الشعبي اليوغوسلافي المكتبة.طريقة استدعاء WriteConsoleW unicode الناتج على وحدة التحكم.

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);
        }
    }
}

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

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

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

ويندوز لا يدعم 65001 صفحة التعليمات البرمجية: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/chcp.mspx?mfr=true

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

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