Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> AWT - внешний шрифт не показывается 
V
    Опции темы
IDVsbruck
Дата 26.1.2007, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: нет
Всего: 22



Для динамического создания битмапа на сервере (JSP-servlet) необходимо использовать определнные графические символы из некоторых шрифтов. Устанавливать на хостинге шрифты из-за меня одного и из-за нескольких символов абсурдно. Поэтому я использую следующий код подключения внешнего шрифта:

Код

BufferedImage buffer = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
Graphics g = buffer.getGraphics();
Graphics2D g2 = (Graphics2D) g;

Font font = null;
try {
    font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream(this.getServletContext().getRealPath("") + "\\fonts\\MySymbolFont.ttf")).deriveFont(Font.PLAIN, 40);
} catch (FontFormatException e) {
    e.printStackTrace();
}

if (font != null) {
    g2.setFont(font);
    g2.drawString("\u00A3", 50, 50);
}


В результате показывает прямоугольничек. При задании любого символа одно и тоже. При подключении обычного тексторого шрифта - все показывается отлично. К примеру, подключил Academia.ttf - работает.

Также пробовал менять кодировки (через new String(str.getBytes({encoding1}), {encoding2})) - не помагает.
Пробовал вытаскивать глифы - их там нет, то есть проблема уже на уровне подключения шрифта.

Как решить проблему - ума не приложу.
Буду очень признателен за дельный совет.

Это сообщение отредактировал(а) IDVsbruck - 26.1.2007, 16:00
PM MAIL   Вверх
LSD
Дата 26.1.2007, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Т.е. проблема не со всеми шрифтами, а только с одним конкретным?
Можешь его выложить?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
IDVsbruck
Дата 26.1.2007, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: нет
Всего: 22



Просмотрел - любой графический шрифт не показывает символы. К ним также относится старый добрый Wingdings.
Другими словами, я попробовал взять графический шрифт из реестра системы (опять же, тот же Wingdings) и отобразить символ(ы) - тот же прямоугольничек (метод Font font = new Font("Wingdings", Font.PLAIN, 40);).

Однако я заметил такую закономерность: если в программке из стандарного пакета Windows (любой версии) - Character table (Таблица символов) символы внизу показываются как "U+XXXX", то есть полноценный Unicode, то и в AWT все в порядке, но если как "0xXX", то прямоугольнички.

Символы в java можно задавать либо символами ("а", "б") либо универсальным написанием ('\u0041', '\u0042'), но в любом случае AWT представляет их в формате UTF8. Но шрифты, по всей видимости, представлены кодировкой ASCII, ANSI, Cp855, Cp1251 или еще какой-то другой, поэтому при чтении символа он "читается не оттуда". То есть я вижу проблему - как задать правильно указатель на нужный символ?

Возможно, мои наблюдения немного абсурдны, но длительность возни с этим вопросом заставляет меня цепляться за любую "ерунду".
PM MAIL   Вверх
LSD
Дата 27.1.2007, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



1. Задание сивола  'A' или '\u0000' имеет значение только для компилятора, внутри Java все строки храняться в UTF-16.
2. Я поэксперементировал с шрифтом Wingdings, символя в нем нормально отображаються, только они находятся не в диапазоне букв, а в диапазоне символов (\uF020 и старше).
Код
BufferedImage buffer = new BufferedImage(300, 300, BufferedImage.TYPE_BYTE_GRAY);
Graphics g = buffer.getGraphics();
Graphics2D g2 = (Graphics2D) g;

FileInputStream fontStream = new FileInputStream("C:\\WINDOWS\\Fonts\\wingding.ttf");
Font font = Font.createFont(Font.TRUETYPE_FONT, fontStream).deriveFont(Font.PLAIN, 40);
fontStream.close();

for(int i = 0; i < 0xFFFF; i++)
{
  char c = (char) i;
  if(font.canDisplay(c))
    System.out.printf("Can display = %1$c (\\u%2$04X)%n", c, i);
}

g2.setFont(font);
g2.drawString("\uF0CD", 50, 50);

JFrame frame = new JFrame("Test frame");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(new JLabel(new ImageIcon(buffer)));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
IDVsbruck
Дата 27.1.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: нет
Всего: 22



Блин, ну где ты раньше был???
Огромное тебе спасибо! Считай, что я тебе уже бутылку высмтавил!  smile 
Тему закрываю.
PM MAIL   Вверх
LSD
Дата 27.1.2007, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Пожалуйста smile

P.S.
Цитата(IDVsbruck @  27.1.2007,  16:50 Найти цитируемый пост)
Считай, что я тебе уже бутылку высмтавил!

Я предпочитаю Guinness smile 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.4764 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.