Снова русский. Теперь на изображениях.
Модератор: Absurd
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
public class image_text extends HttpServlet{
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String text = request.getParameter("text");
String s1 = Integer.toString(text.getBytes()[0]);
try {
BufferedImage frame = ImageIO.read(new FileInputStream("c:\\work\\test_text.GIF"));
Graphics2D g = (Graphics2D)(frame.getGraphics());
g.setPaint(Color.black);
String ss = Integer.toString(text.getBytes()[2]);
g.drawString(s1, 10, 90);
g.drawString(text, 10, 100);
response.setContentType("image/png");
ImageIO.write(frame, "png", response.getOutputStream());
}
catch (Exception e) {
String ss = Integer.toString(text.getBytes()[0]);
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(s1);
out.println(text);
out.close();
}
}
}
результаты:
http://content.gsm4u.ru/java/image_text?text=%FA - пишет -6 ъ (то, что нужно)
http://content.gsm4u.ru/java/text.jsp?text=%FA%FA%FA - рисует 63 и три знака вопроса. Я уже не знаю, что придумать... как так, я число -6 вывожу (не символы, а именно число!), в одном месте оно выводится правильно, а в другом - нет!
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
public class image_text extends HttpServlet{
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String text = request.getParameter("text");
String s1 = Integer.toString(text.getBytes()[0]);
try {
BufferedImage frame = ImageIO.read(new FileInputStream("c:\\work\\test_text.GIF"));
Graphics2D g = (Graphics2D)(frame.getGraphics());
g.setPaint(Color.black);
String ss = Integer.toString(text.getBytes()[2]);
g.drawString(s1, 10, 90);
g.drawString(text, 10, 100);
response.setContentType("image/png");
ImageIO.write(frame, "png", response.getOutputStream());
}
catch (Exception e) {
String ss = Integer.toString(text.getBytes()[0]);
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(s1);
out.println(text);
out.close();
}
}
}
результаты:
http://content.gsm4u.ru/java/image_text?text=%FA - пишет -6 ъ (то, что нужно)
http://content.gsm4u.ru/java/text.jsp?text=%FA%FA%FA - рисует 63 и три знака вопроса. Я уже не знаю, что придумать... как так, я число -6 вывожу (не символы, а именно число!), в одном месте оно выводится правильно, а в другом - нет!
Да вы, батенька, упорно на одни и те же грабли наступаете. Я ж ссылку давал на то, как в Java c русскими буквами работать. В сервлетах в том числе.
а) почему-то не видно декодирования URL
б) getBytes выполняется для дефолтной кодировки. Есть большие подозрения, что это далеко не windows-1251, а ISO-8859-1
а) почему-то не видно декодирования URL
б) getBytes выполняется для дефолтной кодировки. Есть большие подозрения, что это далеко не windows-1251, а ISO-8859-1
Даже самый дурацкий замысел можно воплотить мастерски
хе, я внимательно прочитал ту статью, спасибо за нее.
я делал те варианты из статьи, не помогало.
здесь вопрос в другом.
в s1 хранится число! не буквы, а цифры. это подтверждается выводом: out.println(s1); - выводит -6.
но при этом g.drawString(s1, 10, 90); выводит число 63 (знак вопроса), меня и интересует, почему.
s1 задается в самом начале и нигде не меняется.
я делал те варианты из статьи, не помогало.
здесь вопрос в другом.
в s1 хранится число! не буквы, а цифры. это подтверждается выводом: out.println(s1); - выводит -6.
но при этом g.drawString(s1, 10, 90); выводит число 63 (знак вопроса), меня и интересует, почему.
s1 задается в самом начале и нигде не меняется.
Теряешь 8-й бит.и три знака вопроса
Проведи маленький эксперимент:
Код: Выделить всё
String text = "ъъъ";
String s1 = Integer.toString(text.getBytes()[0]);
g.drawString(s1, 10, 10);
g.drawString(text, 10, 20);
text = URLEncoder.encode(text);
s1 = Integer.toString(text.getBytes()[0]);
g.drawString(s1, 10, 30);
g.drawString(text, 10, 40);
text = URLDecoder.decode(text);
s1 = Integer.toString(text.getBytes()[0]);
g.drawString(s1, 10, 50);
g.drawString(text, 10, 60);
Даже самый дурацкий замысел можно воплотить мастерски
результаты:
-------
63
ъъъ
37
%FA%FA%FA
63
ъъъ
-------
щас буду обмозговывать, почему так....
-------
63
ъъъ
37
%FA%FA%FA
63
ъъъ
-------
щас буду обмозговывать, почему так....
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
AiK, проходил я тут мимо, и не понял твоего намёка ...
"Теряешь 8-й бит"
Хм .. Ну да во втором случае оно выведет 37, а не 63, но если взять String text = "xxx"; то 120 повсюду...
Значит не он теряет, а сама Java неправильно на "ъ" реагирует, или?
тоже не помогает ..
"Теряешь 8-й бит"
Хм .. Ну да во втором случае оно выведет 37, а не 63, но если взять String text = "xxx"; то 120 повсюду...
Значит не он теряет, а сама Java неправильно на "ъ" реагирует, или?
Код: Выделить всё
String text = "ъъъ";
try {text = URLEncoder.encode(text, "Windows-1251");} catch (Exception e){System.out.println("Unsupported encoding");}
Deady, всё дело в кодировках. Я вот не 63, а -6 получаю.
63 - это если так:
s1 = Integer.toString(text.getBytes("ISO-8859-1")[0]);
Соответственно тебе нужно так:
s1 = Integer.toString(text.getBytes("windows-1251")[0]);
А говоришь, что внимательно читал
63 - это если так:
s1 = Integer.toString(text.getBytes("ISO-8859-1")[0]);
Соответственно тебе нужно так:
s1 = Integer.toString(text.getBytes("windows-1251")[0]);
А говоришь, что внимательно читал

Даже самый дурацкий замысел можно воплотить мастерски
Намёк прост: ISO-8859-1 - 7-битовая кодировка.AiK, проходил я тут мимо, и не понял твоего намёка ...
Даже самый дурацкий замысел можно воплотить мастерски
тут проблема похоже в другом.
s1 = Integer.toString(text.getBytes("windows-1251")[0]); - это я делаю во всех сервлетах, просто в одних это работает, в других - нет. почему так - я хз. возможно криво стоит винда, возможно криво стоит томкат.
есть подозрение, что если все сервлеты перекинуть на другую машину, то они опять работать не будут, и начнется снова подгонка кодировок.
рядом где-то ветку создавал: выводится excel лист. если он меньше килобайта (грубо говоря, точно не считал), то Excel показывает его в русской кодировке, а если больше - то в турецкой. Это же маразм какой-то!!
-6 я ксати тоже получал.
s1 = Integer.toString(text.getBytes("windows-1251")[0]); - это я делаю во всех сервлетах, просто в одних это работает, в других - нет. почему так - я хз. возможно криво стоит винда, возможно криво стоит томкат.
есть подозрение, что если все сервлеты перекинуть на другую машину, то они опять работать не будут, и начнется снова подгонка кодировок.
рядом где-то ветку создавал: выводится excel лист. если он меньше килобайта (грубо говоря, точно не считал), то Excel показывает его в русской кодировке, а если больше - то в турецкой. Это же маразм какой-то!!
-6 я ксати тоже получал.