Сбой приложения Java на специальных символах - PullRequest
0 голосов
/ 30 октября 2008

Приложение, над которым я работаю, считывает информацию из файлов для заполнения базы данных. Некоторые символы в файлах не являются английскими, например, акцентированные французские символы.

Приложение работает нормально в Windows, но на нашей машине Solaris оно не распознает специальные символы и выдает исключение. Например, когда он встречает ударение на «Герере», он говорит: -

      Encountered: "\u0161" (353), after : "\'G\u00c3\u00a9rer les mod\u00c3"

(исключение, которое выбрасывается из нашего приложения)

Я подозреваю, что для предотвращения этого мне нужно изменить свойство file.encoding JVM. Я пытался сделать это через System.setProperty (), но это не остановило возникновение ошибки.

Есть какие-нибудь предложения для того, что я мог бы сделать? Я думал о настройке базовой локали платформы Solaris в / etc / default / init как UTF-8. Кто-нибудь думает, что это может помочь?

Любые мысли очень ценятся.

Ответы [ 8 ]

4 голосов
/ 30 октября 2008

Это похоже на файл, который был преобразован в native2ascii с использованием неправильных параметров. Для демонстрации создайте файл с содержанием

Gérer les modÚ

и сохраните его как «a.txt» с кодировкой UTF-8. Затем выполните эту команду:

native2ascii -encoding windows-1252 a.txt b.txt

Откройте новый файл, и вы должны увидеть это:

G\u00c3\u00a9rer les mod\u00c3\u0161

Теперь переверните процесс, но на этот раз укажите ISO-8859-1:

native2ascii -reverse -encoding ISO-8859-1 b.txt c.txt

Прочитайте новый файл как UTF-8, и вы должны увидеть это:

Gérer les modÀ\u0161

Хорошо, он восстанавливает "é", но задыхается от "Ú", как и ваше приложение.

Я не знаю, что все идет не так в вашем приложении, но я уверен, что неправильное использование native2ascii является его частью. И это, вероятно, было результатом того, что приложение использовало системную кодировку по умолчанию. Вы должны всегда указывать кодировку при сохранении текста, будь то файл или база данных, или что - никогда не разрешайте использовать его по умолчанию. И если у вас нет веских причин выбирать что-то другое, используйте UTF-8.

2 голосов
/ 30 октября 2008

Попробуйте использовать

java -Dfile.encoding=UTF-8 ...

при запуске приложения в обеих системах.

Другим способом решения проблемы является изменение кодировки с обеих систем на UTF-8, но я предпочитаю первый вариант (менее навязчивый в системе).

EDIT:

Проверьте этот ответ на stackoverflow, он может помочь либо:

Изменение кодировки по умолчанию для строки (байт [])

1 голос
/ 31 октября 2008

Мне удалось обойти эту ошибку, выполнив команду

export LC_ALL='en_GB.UTF-8'

Эта команда задает языковой стандарт для оболочки, в которой я находился. При этом все переменные среды LC_ устанавливаются в кодировку файла Unicode.

Большое спасибо за все ваши предложения.

1 голос
/ 31 октября 2008

Вместо настройки общесистемной кодировки символов может быть проще и надежнее задать кодировку символов при чтении и записи конкретных текстовых данных. Как ваше приложение читает файлы? Все программы чтения и записи пакетов ввода / вывода Java поддерживают передачу имени кодировки символов, которое будет использоваться при чтении / записи текста в / из байтов. Если вы не укажете один из них, он будет использовать кодировку платформы по умолчанию, что, скорее всего, и происходит.

Некоторые базы данных удивительно ограничены в текстовых кодировках, которые они могут принимать. Если ваше Java-приложение читает файлы в виде текста в правильной кодировке, то оно может вывести его в базу данных так, как это необходимо. Если ваша база данных не поддерживает какую-либо кодировку, в которой символьное повторение включает не-ASCII-символы, которые у вас есть, то вам может понадобиться сначала кодировать текст не на английском языке, например, в байты UTF-8, а затем Base64 кодировать эти байты как текст ASCII. .

PS: никогда не используйте String.getBytes() без аргумента кодировки символов именно по тем причинам, которые вы видите.

0 голосов
/ 24 мая 2010

Java использует кодировку операционной системы по умолчанию при чтении и записи файлов. Теперь никогда не следует полагаться на это. Рекомендуется указывать кодировку явно.

В Java вы можете использовать для чтения и записи следующее:

Чтение:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(inputPath),"UTF-8"));

Запись:

PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8")));
0 голосов
/ 31 октября 2008

Кроме того, вы можете проверить, установлены ли пакеты операционной системы для поддержки UTF-8 (SUNWeulux, SUNWeuluf и т. Д.).

0 голосов
/ 31 октября 2008

Я думаю, нам понадобится дополнительная информация, чтобы помочь вам с вашей проблемой:

  1. Какое исключение вы получаете, и какой метод вы вызываете, когда оно происходит.
  2. Какая кодировка входного файла? UTF8? UTF16 / Unicode? ISO8859-1

Также будет полезно, если вы предоставите нам соответствующие фрагменты кода.

Кроме того, я хотел бы отметить несколько вещей:

  1. Проблема возникает не в «é», а позже.
  2. Похоже, кодировка символов может быть жестко задана в вашем приложении.
0 голосов
/ 30 октября 2008

Вы также можете установить кодировку в командной строке, например, java -Dfile.encoding=utf-8.

...