Можно ли указать кодировку по умолчанию для кодирования ASCII в поле JAI TIFF?

Я храню строки в заголовках TIFF, используя JAI. Некоторые строки содержат символы, значение которых превышает 127d (например, 'é' равно 233d).

Когда я открываю полученный файл TIFF с помощью шестнадцатеричного редактора, я вижу байт 233d, но когда я пытаюсь прочитать его обратно через JAI с помощью TIFFField.getAsString(), я получаю '?' (символ замены Unicode 0xfffd). Я проверил спецификации TIFF 6.0 но они просто упоминают 7-битный ASCII.

Я хотел бы сказать JAI использовать ISO-8859-1 Charset для декодирования строк. Это возможно? Я ничего не нашел в (старом) javadoc. В крайнем случае я мог бы также использовать URL-кодирование для строк, но предпочел бы этого избежать.


person Matthieu    schedule 02.09.2013    source источник
comment
Какой тип тегов TIFF вы пишете? Если теги указаны как ASCII, другой доступной кодировки действительно нет (хотя я видел, как программное обеспечение записывает UTF8 независимо).   -  person Harald K    schedule 02.09.2013
comment
@haraldK Да, это TIFF_ASCII. JAI позаботится о написании через строку Java (которая является Unicode), но если я напишу «é», я получу «?» при обратном чтении.   -  person Matthieu    schedule 03.09.2013


Ответы (1)


Тег TIFF, определенный как ASCII, по спецификации может содержать только простой 7-битный ASCII.

К сожалению, это не очень полезно в реальном мире (где не все из нас говорят по-английски), поэтому многие программы будут записывать в эти поля строки в кодировке UTF8 или даже ISO-8859-x, даже если это противоречит спецификации. В теге ASCII не допускается никакая другая кодировка.

JAI, будучи очень строгим в чтении, вероятно, декодирует строку как простой ASCII, и, поскольку «é» не является частью этой кодировки, он заменяет ее «символом замены Unicode».

Лучше всего сделать одно из следующих действий:

  • Если это разрешено тегом, используйте BYTE или UNDEFINED вместо ASCII + спецификация кодировки.
  • Если возможно, используйте другой тег для записи вашего значения (который допускает значения BYTE или UNDEFINED + спецификацию кодировки).
  • Если ни одно из вышеперечисленных действий невозможно, лучше всего добраться до фактических байтов и декодировать самостоятельно или использовать другую библиотеку для анализа структуры TIFF.
person Harald K    schedule 03.09.2013
comment
Я боялся, что вы это скажете ;) Я бы предпочел не использовать другую библиотеку для анализа TIFF, если вы не знаете ту, которая может обрабатывать многостраничный JPEG-in-TIFF? Возможно ли с помощью JAI получить фактические байты поля для его непосредственного декодирования? - person Matthieu; 03.09.2013
comment
Не уверен, что это соответствует вашим потребностям, но я разрабатываю чистый Java TIFF плагин для ImageIO, который должен поддерживать многостраничные файлы TIFF в формате JPEG (как старые, так и новые варианты). Не стесняйтесь попробовать. Независимо от этого плагина, есть также анализатор TIFF/EXIF, который можно использовать для чтения тегов. Не знаю, позволяет ли JAI вам получить доступ к фактическим байтам, извините. - person Harald K; 03.09.2013
comment
Спасибо, постараюсь найти время, чтобы попробовать. А пока я просто кодирую свои строки в URL-адресе перед их сохранением. Кажется, это окажет наименьшее влияние как на размер, так и на код. - person Matthieu; 04.09.2013
comment
Если контролировать как чтение, так и запись, трюк с URL-кодированием должен быть довольно безопасным. - person Harald K; 04.09.2013