Member 12213239 Ответов: 1

Чтение не-ASCII символов значений тегов TIFF в java


Я пытаюсь прочитать различные значения тегов (например, теги 259 (сжатие), 33432 (Авторское право), 306 (Дата-Время), 315 (исполнитель) и т. д.) Из изображения TIFF в Java 11.

Что я уже пробовал:

Я попробовал с ImageIO, как показано ниже:

File tiffFile = new File(tiffFileName);

    ImageInputStream input = ImageIO.createImageInputStream(tiffFile) 
    ImageReader reader = ImageIO.getImageReaders(input).next(); 

    reader.setInput(input);
    IIOMetadata metadata = reader.getImageMetadata(0); 

    TIFFDirectory ifd = TIFFDirectory.createFromMetadata​(metadata);
    TIFFField myTag = ifd.get​TIFFField(33432); 
    String tagString = myTag.getAsString(0);  
    // problem here

    //String[][] replacements = { { "ä", "ae" }, { "ü", "ue" }, { "ö", "oe" }};
    String[][] replacements = {{"\u00C4", "Ae"}, {"\u00DC", "Ue"}, {"\u00D6", "Oe"},    
          {"\u00E4", "ae"}, {"\u00FC", "ue"}, {"\u00F6", "oe"}, {"\u00DF", "ss"} };

    for (String[] replacement : replacements) {
       tagString = tagString.replaceAll(replacement[0], replacement[1]);
    }


Но это не дает точного значения тега. В случае значений, отличных от ASCII (ö, ü, ä и т. д.), вопросительные знаки заменяют реальные значения. TIFFField.getAsString(0) возвращает такие значения, как Universit�t. Но я хочу в университет.

Может ли кто-нибудь сказать мне, как получить байтовые значения тега, а затем декодировать его с помощью utf-8, чтобы получить точные значения тега ?

Также приветствуется предложение об альтернативной библиотеке java для чтения изображений TIFF. Мне просто нужно прочитать точные значения тегов, включая символы, отличные от ASCII.

Richard MacCutchan

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

Member 12213239

есть идеи, как обращаться с отображаемым шрифтом ?

Richard MacCutchan

Это зависит от того, как вы показываете результаты.

Member 12213239

Я хочу заменить умлаут (ä, ö и ü) эквивалентными символами, такими как ae, oe и ue. Моя проблема здесь заключается в том, что TIFFField.getAsString(0) возвращает такие значения, как Universit�t, а не точное значение Universität. Можете ли вы конкретно сказать мне, как получить точное значение, включая умлаут ?

Richard MacCutchan

Нет, они не возвращают "Universit�t", то есть вы пытаетесь отобразить символ в шрифте, который не имеет эквивалента для значения этого символа. Вам нужно изучить фактическое значение персонажа. Бесполезно пытаться его напечатать и надеяться на лучшее. Посмотрите на приложение "Карта символов" в папке "аксессуары Windows" в меню "Пуск". Это покажет вам, какие символы эквивалентны в разных языковых шрифтах.

Member 12213239

Я не печатаю здесь значения. Когда я отлаживаю код ( в IntelliJ IDEA ), он показывает Universit�t, а не точное значение Universität. Мне просто нужно прочитать значение тега и заменить umlauts эквивалентными символами (например, ae для ä, ue для ü ) в строке. Если я не могу прочитать умлаут, я не могу заменить его эквивалентными значениями. можете ли вы дать какие-либо подсказки, как читать точный умлаут здесь ?

Richard MacCutchan

Перестаньте смотреть на них как на отображаемые, а посмотрите на фактическое числовое значение символа, то есть то, что определяет, что будет отображаться. Например, в Юникоде символ ä имеет значение 0x00E4. И если ваш набор шрифтов дисплея использует другое сопоставление, то вы получите любой символ с этим значением в наборе шрифтов. Всю эту информацию можно найти в приложении Character Map, о котором я упоминал выше.

Richard MacCutchan

Строка-это просто массив байтов. Символы ASCII представлены 8-битными байтовыми значениями, А Unicode-16-битными. Я предлагаю вам взять книгу по компьютерным основам и узнать, как хранятся и обрабатываются данные.

Member 12213239

я новичок в программировании на Java. не могли бы вы помочь, пожалуйста ?

Richard MacCutchan

Это не имеет ничего общего с Java, речь идет о понимании компьютеров и о том, как хранятся и обрабатываются данные, и что может представлять собой каждый байт или последовательность байтов. Если вы не понимаете основы, вы будете бороться все больше и больше.

Member 12213239

я понял, к чему ты клонишь. здесь я использую replaceAll() для замены umlaut в строке. Но myTag.getAsString(0) не возвращает точное значение. чего мне здесь не хватает ? Как я могу манипулировать строкой по-другому ?

Richard MacCutchan

Что вы имеете в виду под этим "Но myTag.getAsString(0) не возвращает точное значение"- Я не могу догадаться, что происходит в вашей системе.

Member 12213239

Пожалуйста, взгляните на мой обновленный код выше. Здесь myTag.getAsString(0) возвращает такие значения, как Universit�t. Но точное значение-Universität. Как я могу заменить умлаут, если не получу точного значения ? Можете ли вы сказать мне, как получить доступ к байтовых значений и заменить умлаут со значениями equavalent как AE для ä, ü UE на и так далее ?

Richard MacCutchan

Рискуя повториться до тошноты: посмотрите на фактические значения каждого символа в возвращаемых данных.

Member 12213239

ты имеешь в виду вот так ? Строка[][] umlautReplacements = { { "\u00C4", "ае" }, { "\u00DC", "УП" }, { "\u00D6", "оригинального" }, { "\u00E4", "ае" }, { "\u00FC", "УП" }, { "\u00F6", "оригинального" }, { "\u00DF", "СС" } };

Richard MacCutchan

Да.

Member 12213239

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

Richard MacCutchan

Извините, я понятия не имею, что это значит. Я только что протестировал ваш код, и он работает правильно.

Member 12213239

Я попытался преобразовать строку в байтовый массив и заменить умлаут. но это не работает.

Member 12213239

можете ли вы дать небольшие подсказки ?

1 Ответов

Рейтинг:
1

Patrice T

Цитата:
Может ли кто-нибудь сказать мне, как получить байтовые значения тега, а затем декодировать его с помощью utf-8, чтобы получить точные значения тега ?

Во-первых, вы должны понимать, что до unicode (DOS era) коды ascii между 128-255 использовались для специальных символов и с кодами страниц для обработки различных кодировок.
ASCII-код - Расширенная таблица ASCII[^]
Одна из причин того, формат TIFF использует этот конфликт был создан до начала существования Юникод или утф на тот момент они нуждались способы кодирования не ASCII-символов.
-Итак, чтобы узнать, что было прочитано, вам нужно отобразить в шестнадцатеричном виде.
Ваше чтение, вероятно, составляет: 55 6E 69 76 65 72 73 69 74 84 74, ä обычно кодируется как 84.
- Вам нужно понять, как кодируются ваши данные, а затем вызвать функцию, которая преобразуется в кодировку вашего приложения.
- если вы хотите обновить эти данные, вам нужно будет сделать кодирование в обратном порядке.

В вашем случае вам, вероятно, потребуется преобразование из CP437 в urf8.