Чтение не-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.getTIFFField(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
можете ли вы дать небольшие подсказки ?