Кодировка символов Java Запись в текстовый файл

Моя проблема заключается в следующем:

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

Исходная информация

Эти данные хранятся в базе данных MSQL. Сортировка базы данных — SQL_Latin1_General_CP1_CI_AS, а поля — varchar. Я пришел, чтобы изучить сопоставление и тип, чтобы определить, какая кодировка символов используется на стороне базы данных. Значения хранятся правильно, поэтому здесь нет проблем.

Мое приложение Java выполняет запросы для извлечения данных из БД, и это тоже выглядит нормально. Я отладил код и увидел, что все строки имеют правильное представление перед записью в файл.

Затем я записываю текст в файл .TXT, используя OutputStreamWriter, следующим образом:

public OfferFileBuilder(String clientAppName, boolean isAppend) throws IOException, URISyntaxException {
        String exportFileLocation = getExportedFileLocation();
        File offerFile = new File(getDatedFileName(exportFileLocation+"/"+clientAppName+"_OFFERRECORDS"));
        bufferedWriter  = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(offerFile, isAppend), "UTF-8"));
    }

Теперь, когда я открываю файл на сервере Linux, запуская команду cat для файла или открывая файл с помощью notepad++, некоторые символы отображаются неправильно.

Я выполнил следующие команды на сервере, чтобы увидеть его кодировку locale charmap, которая печатает UTF-8, echo $LANG, которая печатает en_US.UTF-8, а echo $LC_CTYPE` ничего не печатает.

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

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


person Marquis Blount    schedule 14.10.2015    source источник
comment
Как насчет использования кодировки UTF-8 с классом PrintWriter ? Он предназначен для потоков вывода текста.   -  person AndrewMcCoist    schedule 15.10.2015
comment
Что выводит echo $LC_CTYPE?   -  person Andreas    schedule 15.10.2015
comment
При использовании Notepad++ убедитесь, что в раскрывающемся меню «Кодировка» указано UTF-8 без спецификации. (в любом случае это то, что должно быть в Windows, при условии, что версия для Linux аналогична)   -  person Andreas    schedule 15.10.2015
comment
@AndrewMcCoist Я не пробовал PrintWriter, но он наследуется от Writer, который я использую   -  person Marquis Blount    schedule 15.10.2015
comment
@Andreas, когда я запускаю echo $LC_CTYPE, он ничего не печатает.   -  person Marquis Blount    schedule 15.10.2015
comment
Кроме того, пример кода буферизует файл дважды.   -  person Tassos Bassoukos    schedule 15.10.2015
comment
@TassosBassoukos спасибо, что указали, что я пробовал так много разных вариантов, позвольте мне обновить правильный вариант   -  person Marquis Blount    schedule 15.10.2015
comment
Этот код выглядит хорошо, вы пытались запустить вывод через hd, чтобы определить, что выводится?   -  person Tassos Bassoukos    schedule 15.10.2015
comment
@TassosBassoukos извините, не знаком с аббревиатурой hd   -  person Marquis Blount    schedule 15.10.2015
comment
hd — команда шестнадцатеричного дампа; он показывает шестнадцатеричные значения символов в файле.   -  person Tassos Bassoukos    schedule 15.10.2015
comment
Хорошо, я смог запустить шестнадцатеричный дамп. Не уверен, что это будет полезно   -  person Marquis Blount    schedule 15.10.2015


Ответы (1)


выполнение команды file -bi на сервере показало, что файл был закодирован с помощью ascii вместо utf8. Полное удаление файла и повторный запуск процесса исправили это для меня.

person Marquis Blount    schedule 17.10.2015