Ответ 1
Попробуйте chcp 65001 && start.bat
Мы пытаемся использовать Java и UTF-8 для Windows. Приложение записывает журналы на консоль, и мы хотели бы использовать UTF-8 для журналов, поскольку наше приложение имеет интернализированные журналы.
Можно настроить JVM, чтобы он генерировал UTF-8, используя -Dfile.encoding=UTF-8
в качестве аргументов JVM. Он отлично работает, но вывод на консоли Windows искажен.
Затем мы можем установить кодовую страницу консоли на 65001 (chcp 65001
), но в этом случае файлы .bat
не работают. Это означает, что когда мы пытаемся запустить наше приложение через наш script (named start.bat), абсолютно ничего не происходит. Команда simple возвращает:
C:\Application> chcp 65001
Activated code page: 65001
C:\Application> start.bat
C:\Application>
Но без chcp 65001
нет проблем, и приложение может быть запущено.
Любые намеки на это?
Попробуйте chcp 65001 && start.bat
Java на окнах по умолчанию не поддерживает unicode. Я написал метод обхода путем вызова Native API с библиотекой JNA. Этот метод вызовет 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);
}
}
}
У нас были некоторые подобные проблемы в Linux. Наш код был в ISO-8859-1 (в основном совместимый cp-1252), но консоль была UTF-8, что делало код не компилируемым. Простое изменение консоли на ISO-8859-1 приведет к разрыву сборки script в UTF-8. Мы нашли пару вариантов:
1- Определить стандартную кодировку и клеймо. Это был наш выбор. Мы решили сохранить все в ISO-8859-1, модифицируя скрипты сборки.
2- Установка кодировки перед запуском любой задачи, даже внутри скриптов сборки. Некоторый код, подобный эриксону, сказал. В Linux было похоже:
lang=pt_BR.ISO-8859-1 /usr/local/xxxx
Мое затмение все еще похоже на это. Оба хорошо работают.
Windows не поддерживает кодовую страницу 65001: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/chcp.mspx?mfr=true
Вы пробовали PowerShell, а не старый cmd.exe.