Может ли кто-нибудь объяснить это поведение, связанное с кодированием?

Может ли кто-нибудь объяснить это поведение, связанное с кодированием?

Кодирование не является моей сильной стороной, хотя я и читал немало.

Есть файл, который я хочу отредактировать, его расширение .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 учитывают это...

Связанный контент