Греческая строка не соответствует регулярному выражению при чтении с клавиатуры - PullRequest
11 голосов
/ 02 января 2011
public static void main(String[] args) throws IOException {
   String str1 = "ΔΞ123456";
   System.out.println(str1+"-"+str1.matches("^\\p{InGreek}{2}\\d{6}")); //ΔΞ123456-true

   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
   String str2 = br.readLine(); //ΔΞ123456 same as str1.
   System.out.println(str2+"-"+str2.matches("^\\p{InGreek}{2}\\d{6}")); //Δ�123456-false

   System.out.println(str1.equals(str2)); //false
}

Эта строка не соответствует регулярному выражению при чтении с клавиатуры.
В чем причина этой проблемы и как мы можем ее решить?
Заранее спасибо.

РЕДАКТИРОВАТЬ: я использовал System.console () для ввода и вывода.

public static void main(String[] args) throws IOException {
        PrintWriter pr = System.console().writer();

        String str1 = "ΔΞ123456";
        pr.println(str1+"-"+str1.matches("^\\p{InGreek}{2}\\d{6}")+"-"+str1.length());

        String str2 = System.console().readLine();
        pr.println(str2+"-"+str2.matches("^\\p{InGreek}{2}\\d{6}")+"-"+str2.length());

        pr.println("str1.equals(str2)="+str1.equals(str2));
}

Выход:

ΔΞ123456-правда-8
ΔΞ123456
ΔΞ123456-правда-8
str1.equals (str2) = True

Ответы [ 4 ]

9 голосов
/ 02 января 2011

Есть несколько мест, где ошибки транскодирования могут иметь место здесь.

  1. Убедитесь, что ваш класс компилируется правильно (вряд ли это будет проблемой в IDE):
    • Убедитесьчто компилятор использует ту же кодировку, что и ваш редактор (т. е. если вы сохраняете как UTF-8, установите свой компилятор на использование этой кодировки )
    • или переключитесь на экранирование в подмножество ASCII, котороебольшинство кодировок являются надмножеством (то есть изменяют строковый литерал на "\u0394\u039e123456")
  2. Убедитесь, что вы читаете ввод, используя правильную кодировку:
    • Используйте Консоль для чтения ввода - этот класс будет определять кодировку консоли
    • . Или настроить ваш Reader на использование правильной кодировки (возможно, windows-1253) или установить консоль на Java * 1023.* кодировка по умолчанию

Обратите внимание, что System.console() возвращает ноль в IDE, но есть вещей, которые вы можете сделать с этим .

8 голосов
/ 02 января 2011

Если вы используете Windows, это может быть вызвано тем, что кодировка символов консоли («Кодовая страница OEM») отличается от кодировки системы («Кодовая страница ANSI»).

InputStreamReader без явного параметра кодирования предполагает, что входные данные находятся в кодировке системы по умолчанию, поэтому символы, считываемые из консоли, декодируются неправильно.

Для правильного чтения не-as-ascii символов в консоли Windows необходимо указатьКонсольное кодирование явно при построении InputStreamReader (требуемый номер кодовой страницы можно найти, выполнив mode con cp в командной строке):

BufferedReader br = new BufferedReader(
    new InputStreamReader(System.in, "CP737")); 

Та же проблема относится к выводу, вам нужно создать PrintWriterс правильной кодировкой:

PrintWriter out = new PrintWrtier(new OutputStreamWriter(System.out, "CP737"));

Обратите внимание , что начиная с Java 1.6 вы можете избежать этих обходных путей, используя Console объект, полученный из System.console().Он предоставляет Reader и Writer с правильно настроенной кодировкой, а также некоторые служебные методы.

Однако System.console() возвращает null, когда потоки перенаправляются (например, при запуске из IDE).Обходной путь для этой проблемы можно найти в ответе Макдауэлла.

См. Также:

1 голос
/ 02 января 2011

Я получаю истину в обоих случаях, когда в вашем коде ничего не изменилось. (Я тестировал греческую раскладку клавиатуры - я из Греции:])
Вероятно, ваша клавиатура отправляет ASCII в 8859-7 ISO, а не UTF-8. Шахта отправляет UTF-8.

РЕДАКТИРОВАТЬ: Я все еще верен с добавлением команды равенства ..

System.out.println(str1.equals(str2));


Проверьте, можете ли вы заставить его работать, изменив все на греческое в региональных настройках (если вы используете windows).

Rundll32 Shell32.dll,Control_RunDLL Intl.cpl,,0

Если это так, то вы можете действовать соответственно ... как сказал 'axtavt'

0 голосов
/ 02 января 2011

Скорее всего, клавиатура отправляет символы не в формате UTF-8, а в качестве кодировки символов операционной системы по умолчанию.

Смотри также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...