Проблема кодирования в Java - PullRequest
5 голосов
/ 23 июня 2009

У меня есть CSV-файл, который содержит символы ASCII и Unicode. сказать "ÅÔÉA". Я не уверен насчет формата кодировки этого файла, но когда я открываю его в Блокноте, в качестве стандарта кодирования он показывает «ANSI».

Я получаю это содержимое CSV в кодированном формате UTF-8.

fr = новый InputStreamReader (новый FileInputStream (fileName), "UTF-8");

но когда я сохраняю его в БД, эти специальные символы, кроме «A», не сохраняются должным образом. персонажи зашифрованы

Я хочу, чтобы все символы были сохранены правильно. Есть идеи?

Ответы [ 8 ]

6 голосов
/ 23 июня 2009

«ANSI» в «Блокноте» означает любую кодовую страницу, которую используют ваши окна. Попробуйте ISO8859-1, это работает в большинстве случаев.

2 голосов
/ 23 июня 2009

Прежде всего, вам необходимо знать кодировку файла. Откройте его гекседором. Сколько байт занимает персонаж? Если он только один, то файл находится не в UTF-8, а, скорее всего, в какой-то ISO-8859 или аналогичной кодировке Windows (например, Win-1252). Как упоминалось ранее, есть вероятность, что ISO-8859-1 является правильной кодировкой. Для языков Восточной Европы ISO-8859-2 будет правильным выбором.

Второй проблемой будет набор символов, поддерживаемый вашей базой данных для символьных столбцов (этот параметр задается во время установки / создания нового экземпляра), но, поскольку вы можете вставить эти символы напрямую, в этом случае это не будет проблемой.

Какой драйвер jdbc вы используете? Тонкий драйвер не должен создавать проблем в этом отношении, в то время как драйвер OCI может создать дополнительный уровень проблем, если настройка NLS_LANG клиента не соответствует кодировке символов базы данных.

2 голосов
/ 23 июня 2009

Была эта проблема. Вам нужно две вещи: столбцы NVARCHAR2 и вызов метода для конкретного оракула в подготовленном состоянии, чтобы уведомить оракула о кодировке строки:

/**
 * Sets a statement parameter as NCHAR. Use before setting the field value. 
 * @param pstmt the prepared statement
 * @param index the parameter index
 */
public static void setNChar(PreparedStatement pstmt, int index) {
    OraclePreparedStatement opstmt = (OraclePreparedStatement)pstmt;
    opstmt.setFormOfUse(index, OraclePreparedStatement.FORM_NCHAR);
}

Если вы используете простую строку SQL с символами юникода, это работает, когда Oracle получает все команды SQL в UTF-8: драйвер автоматически переводит. Однако для использования подготовленного оператора вам необходимо явно указать это оракулу.

Вы также можете попробовать PreparedStatement.setNString () , если вы используете Java 6 и у вас есть драйвер ojdbc6. (В моем случае нам пришлось использовать Java 5 с драйвером версии 4 - не спрашивайте, почему)

(Примечание: я знаю, что это блокировка вендора, поскольку вы вынуждены использовать конкретные классы оракула вместо интерфейсов jdbc)

1 голос
/ 23 июня 2009

Я предлагаю создать небольшую программу, которая читает из файла и распечатывает значение unicode прочитанных символов, чтобы вы могли убедиться, что показанные значения верны. Диаграммы кодов доступны на http://www.unicode.org/charts/ - вы, вероятно, можете делать с диаграммами Basic Latin и Latin-1.

Я предполагаю, что кодировка является родной кодировкой Windows. Тогда вы можете полностью избежать параметра «UTF-8» и позволить Java использовать кодировку платформы по умолчанию.

0 голосов
/ 23 июня 2009

Первое, что нужно сделать, это System.out.println () строки после того, как вы загрузили ее из файла. Если он поврежден в консоли, ваш файл на самом деле не является UTF-8, если он выглядит нормально, у вас есть проблема с тем, как вы сохраняете его в базу данных:)

0 голосов
/ 23 июня 2009

Вы можете вручную сравнить шестнадцатеричный дамп символьных выходов с различными кодировками ( пример кода ), хотя это может быть трудоемким процессом. Кроме того, вы можете использовать библиотеку ICU , чтобы попытаться определить используемую кодировку , хотя это вряд ли надежный метод.

Как был создан файл CSV? Если оно было создано приложением Windows на английской ОС, то кодировка, вероятно, будет windows-1252 ( каноническое имя "Cp1252" в Java ); в польской системе это может быть windows-1250 . Лучше всего выяснить наверняка, в какой кодировке был сохранен файл.

0 голосов
/ 23 июня 2009

Вам необходимо кодировать это в ISO 8859-1, а не в UTF-8.

0 голосов
/ 23 июня 2009

Поддерживает ли поле базы данных Unicode? В MSSQL тип поля должен быть nvarchar вместо varchar. Какую базу данных вы используете?

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