Кодирование не является моей сильной стороной, хотя я и читал немало.
Есть файл, который я хочу отредактировать, его расширение .tdl, но это ничего конкретного не означает.
Это XML-файл. Первая строка выглядит так:
<?xml version="1.0" encoding="utf-16"?>
Когда я пытаюсь открыть этот файл с помощью gedit, я получаю большое сообщение на желтом фоне:
«Возникла проблема при открытии файла... Файл, который вы открыли, содержит недопустимые символы. Если вы продолжите редактирование этого файла, вы можете повредить этот документ. Вы также можете выбрать другую кодировку символов и повторить попытку»
В раскрывающемся списке «Кодировка символов» указано «Текущая локаль (UTF-8)».
Я пытаюсь установить значение "Unicode (UTF-16)" и нажимаю "Повторить". Возвращается неприятное сообщение, и выпадающий список возвращается к значению "Текущая локаль (UTF-8)".
Я также пробовал открыть файл, перейдя в Файл --> Открыть --> Кодировка символов: изменить с "Автоматически определяется" на "Unicode (UTF-16)". Но я снова получаю неприятное сообщение, снова с выпадающим списком, установленным на "Текущая локаль (UTF-8)".
Программно (используя Groovy groovy.xml.XMLParser
) я могу разобрать этот файл и создать, по-видимому, допустимую groovy.util.Node
структуру. Я еще не дошел до стадии попытки сохранить эту внутреннюю структуру Node, измененную или нет.
Может ли кто-нибудь сказать мне, что не так (если не так) с этим файлом, и как я могу безопасно его редактировать?
решение1
В кодировке UTF-16 символы располагаются в двух байтах, а для символов ASCII старший байт равен 0x00.
Например, «Something» в UTF-16 выглядит так:
00000000 ff fe 53 00 6f 00 6d 00 65 00 74 00 68 00 69 00 |..S.o.m.e.t.h.i.|
00000010 6e 00 67 00 0a 00 |n.g...|
( OxFFFE
В начале находится метка порядка байтов, если вы видите 0xFEFF, то знаете, что вам нужно поменять байты местами...).
Символы NUL повсюду действительно сбивают с толку программное обеспечение...
Вы можете преобразовать в более приемлемый UTF-8, используя iconv
:
iconv -f UTF-16 -t UTF-8 <utf16file >utf8file
И не забудьте сменить кодировку в заголовке файла.
решение2
Если файл в кодировке UTF-16 (типичная кодировка Windows), у вас будут проблемы под Linux (родная кодировка UTF-8, воинственная...). По крайней мере, GNU emacs говорит, что поддерживает UTF-16, никогда не использовал его в гневе.
Вы можете попробовать перекодировать в UTF-8 (и исправить заголовки и т.п. для соответствия), но это может серьезно нарушить работу инструментов, ожидающих UTF-16.
Обновлять:Только что подумал об этом: перекодировать в UTF-8; искажать, шпиндель, дефейсить на досуге; перекодировать обратно в UTF-16. Таким образом, вы можете использовать знакомые инструменты в середине. Ноделатьисправление кодировки UTF-16 анонсировано, кто знает, будут ли путаться инструменты. Или, возможно, инструменты искажения XML учитывают это...