Java кодировка и Windows - PullRequest
       18

Java кодировка и Windows

4 голосов
/ 19 января 2009

У меня есть Java-программа, которая запускает msinfo32.exe (системная информация) во внешнем процессе, а затем читает содержимое файла, созданного msinfo32.exe. Когда программа Java загружает содержимое файла в строку, символы строки не читаются. Чтобы String был читабельным, я должен создать String, используя String (byte [] bytes, String charsetName) и установить charsetName в UTF-16. Однако при работе в одном экземпляре Windows2003 только UTF-16LE (little-endian) приводит к выводу на печать строки.

Как узнать заранее, какую кодировку использовать?

Также будет полезна любая справочная информация по этой теме.

Ответы [ 5 ]

5 голосов
/ 19 января 2009

Некоторые приложения Microsoft используют метку порядка байтов , чтобы указать файлы Unicode и их порядковый номер. На моем компьютере с Windows XP я вижу, что экспортированный файл .NFO начинается с 0xFFFE, поэтому он имеет младший порядок.

FF FE 3C 00 3F 00 78 00 6D 00 6C 00 20 00 76 00         __<_?_x_m_l_ _v_
65 00 72 00 73 00 69 00 6F 00 6E 00 3D 00 22 00         e_r_s_i_o_n_=_"_
31 00 2E 00 30 00 22 00 3F 00 3E 00 0D 00 0A 00         1_._0_"_?_>_____
3C 00 4D 00 73 00 49 00 6E 00 66 00 6F 00 3E 00         <_M_s_I_n_f_o_>_
0D 00 0A 00 3C 00 4D 00 65 00 74 00 61 00 64 00         ____<_M_e_t_a_d_

Кроме того, я рекомендую переключиться на использование Reader реализаций, а не конструктора String для декодирования файлов; это помогает избежать проблем, когда вы читаете половину символа, потому что он усекается, потому что он находится в конце байтового массива.

2 голосов
/ 19 января 2009

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

1 голос
/ 19 января 2009

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

0 голосов
/ 19 января 2009

Способ, которым он должен работать, заключается в том, что если кто-то дает вам файл и говорит, что это UTF-16, они ожидают, что вы изучите первые два байта (BOM), чтобы выяснить, является ли он прямым или младшим порядковым номером. Но если вам сообщают, что кодировка UTF-16LE , это означает, что спецификации нет; вам это не нужно, потому что они уже сказали вам, что порядок байтов в порядке байтов. Java точно следует этим правилам, что является настоящим недостатком, потому что никто другой этого не делает.

Нативной кодировкой символов современных операционных систем Windows является UTF-16, little-endian. К сожалению, отдельные программы кажутся непоследовательными в том, что касается порядка следования байтов. И вы не можете просто использовать UTF-16LE все время, потому что, если спецификация там , она будет передана как ненужный символ. Единственный способ узнать заранее, использовать ли UTF-16 или UTF-16LE, - это исследовать первые два байта, как описал Макдауэлл.

0 голосов
/ 19 января 2009

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

Можете ли вы настроить свое приложение для получения известного результата? Не нужно быть полной строкой, подойдут только первые символы. Если да, то вы можете сравнить полученный байтовый массив с ожидаемым в различных кодировках и выполнить обнаружение. Массивы байтов UTF8, UTF-16 big и little endian будут отличаться событием для простых строк.

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