Java: Как определить правильную кодировку кодировки потока

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

Я полагаю, что вам понадобится этот запрос (без просмотра данных примера и ожидаемого результата, хотя, возможно, он не будет точным на 100%):

SELECT
    computers.computer_name,
    users.username,
    data_logs.window_title,
    data_logs.filename,
    data_logs.capture_timestamp
FROM computers
INNER JOIN users
    ON users.computer_id = computers.computer_id
INNER JOIN data_logs
    ON data_logs.user_id = users.user_id AND data_logs.marked != 1
WHERE 
    computers.account_id = :cw_account_id 
    AND computers.status = 1
    AND data_logs.capture_timestamp = (
        SELECT MAX(d.capture_timestamp)
        FROM computers c
                INNER JOIN users u ON u.computer_id = c.computer_id
        INNER JOIN data_logs d ON d.user_id = u.user_id AND d.marked != 1
        WHERE c.computer_id = computers.computer_id AND c.account_id = computers.account_id
    )
ORDER BY data_logs.capture_timestamp desc
135
задан Community 23 May 2017 в 12:10
поделиться

7 ответов

Можете Вы выбирать соответствующий символьный набор в Конструкторе:

new InputStreamReader(new FileInputStream(in), "ISO8859_1");
-12
ответ дан 23 November 2019 в 23:45
поделиться

Если Вы не знаете кодирование своих данных, не настолько легко определить, но Вы могли попытаться пользоваться библиотекой для предположения этого. Кроме того, существует подобный вопрос.

4
ответ дан 23 November 2019 в 23:45
поделиться

Можно, конечно, проверить файл для конкретного набора символов путем декодирования его с a CharsetDecoder и не упущение "уродливого входа" или "неотображаемо-символьных" ошибок. Конечно, это только говорит Вам, если набор символов является неправильным; это не говорит Вам, если это корректно. Для этого Вам нужно основание сравнения для оценки декодируемых результатов, например, Вы знаете заранее, ограничиваются ли символы некоторым подмножеством, или придерживается ли текст некоторого строгого формата? Нижняя строка - то, что обнаружение набора символов является догадками без любых гарантий.

13
ответ дан 23 November 2019 в 23:45
поделиться

Вы не можете определить кодирование произвольного потока байтов. Это - природа кодировки. Кодирование означает отображение между значением байта и его представлением. Таким образом, каждое кодирование "могло" быть правом.

getEncoding () метод возвратит кодирование, которое было настроено (считайте JavaDoc) для потока. Это не предположит кодирование для Вас.

Некоторые потоки говорят Вам, какое кодирование использовалось для создания их: XML, HTML. Но не произвольный поток байтов.

Так или иначе Вы могли попытаться предположить кодирование самостоятельно, если Вы имеете к. Каждый язык имеет общую частоту для каждого символа. На английском языке символ e появляется очень часто, но ê будет появляться очень очень редко. В потоке ISO-8859-1 обычно существуют символы № 0x00. Но поток UTF-16 имеет многие из них.

Или: Вы могли спросить пользователя. Я уже видел приложения, которые представляют Вас отрывок файла в различной кодировке и просят, чтобы Вы выбрали "корректную".

103
ответ дан 23 November 2019 в 23:45
поделиться

Для файлов ISO8859_1 не существует простого способа отличить их от ASCII. Однако для файлов Unicode это обычно можно обнаружить по первым нескольким байтам файла.

Файлы UTF-8 и UTF-16 включают Знак порядка байтов (BOM) в самом начале файл. Спецификация представляет собой неразрывное пространство нулевой ширины.

К сожалению, по историческим причинам Java не обнаруживает это автоматически. Такие программы, как Блокнот, проверят спецификацию и используют соответствующую кодировку. Используя unix или Cygwin, вы можете проверить спецификацию с помощью команды file. Например:

$ file sample2.sql 
sample2.sql: Unicode text, UTF-16, big-endian

Для Java я предлагаю вам проверить этот код, который определит распространенные форматы файлов и выберет правильную кодировку: Как прочитать файл и автоматически указать правильную кодировку

2
ответ дан 23 November 2019 в 23:45
поделиться

Я нашел хорошую библиотеку сторонних разработчиков, которая может обнаружить реальную кодировку: http://glaforge.free.fr/wiki/index.php?wiki=GuessEncoding

Я не проводил тщательного тестирования, но похоже, что она работает.

5
ответ дан 23 November 2019 в 23:45
поделиться

edtFTP net - это свободная, быстрая FTP-библиотека с открытым исходным кодом для .NET, написанная на C #.

-121--787309-

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

Если прервать операцию, вы не узнаете, в каком состоянии вы оставили базовый класс. Например, он, возможно, приобрел блокировку, и ваши сведения привели к тому, что эта блокировка не была снята. Даже если объект будет уничтожен после прерывания операции, возможно, он изменил какое-либо глобальное состояние и, следовательно, вы не сможете надежно создать новый экземпляр без перезапуска.

-121--1188270-

Приведенные выше буквы являются простыми детекторами спецификации, которые, конечно, работают только при наличии спецификации в начале файла. Посмотрите на http://jchardet.sourceforge.net/ , который сканирует текст

7
ответ дан 23 November 2019 в 23:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: