2008-10-30 19 views
0

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

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

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

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

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

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

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

ответ

2

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

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

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

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

EDIT:

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

Changing the default encoding for String(byte[])

+0

да, я видел, что раньше. Моя единственная проблема в том, что я не могу найти, где фактически выполняется команда java. Это потому, что программа использует Ant для запуска кода. Спасибо за ваш ответ, хотя я попытаюсь использовать его. – Scottm 2008-10-30 17:20:00

0

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

4

Это файл, который был конвертирован 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.

+0

хороший ответ - я рассмотрю ваше предложение. Спасибо – Scottm 2008-10-31 10:29:04

1

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

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

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

0

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

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

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

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

  1. Проблема не происходит в «е», но позже.
  2. Похоже, что кодировка символов может быть жестко закодирована в вашем приложении.
+0

Исключением является тот, который определен в нашем программном обеспечении, он бросается, когда парсер пробовал все, но все еще не распознает символ. Используемая кодировка является системной по умолчанию, по умолчанию она была установлена ​​в en_GB.ISO8859-15. Я ищу способ заставить приложение читать UTF8 – Scottm 2008-10-31 10:40:21

0

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

1

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

export LC_ALL='en_GB.UTF-8'

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

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

0

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

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

Reading:

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

Запись:

PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8")));