Снова русский. Теперь на изображениях.

Модератор: Absurd

Ответить
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

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 вывожу (не символы, а именно число!), в одном месте оно выводится правильно, а в другом - нет!
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Да вы, батенька, упорно на одни и те же грабли наступаете. Я ж ссылку давал на то, как в Java c русскими буквами работать. В сервлетах в том числе.
а) почему-то не видно декодирования URL
б) getBytes выполняется для дефолтной кодировки. Есть большие подозрения, что это далеко не windows-1251, а ISO-8859-1
Даже самый дурацкий замысел можно воплотить мастерски
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

хе, я внимательно прочитал ту статью, спасибо за нее.
я делал те варианты из статьи, не помогало.
здесь вопрос в другом.
в s1 хранится число! не буквы, а цифры. это подтверждается выводом: out.println(s1); - выводит -6.
но при этом g.drawString(s1, 10, 90); выводит число 63 (знак вопроса), меня и интересует, почему.
s1 задается в самом начале и нигде не меняется.
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

и три знака вопроса
Теряешь 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); 

Даже самый дурацкий замысел можно воплотить мастерски
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

результаты:
-------
63
ъъъ
37
%FA%FA%FA
63
ъъъ
-------
щас буду обмозговывать, почему так....
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

AiK, проходил я тут мимо, и не понял твоего намёка ...
"Теряешь 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");}
тоже не помогает ..
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Deady, всё дело в кодировках. Я вот не 63, а -6 получаю.
63 - это если так:
s1 = Integer.toString(text.getBytes("ISO-8859-1")[0]);
Соответственно тебе нужно так:
s1 = Integer.toString(text.getBytes("windows-1251")[0]);

А говоришь, что внимательно читал :(
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

AiK, проходил я тут мимо, и не понял твоего намёка ...
Намёк прост: ISO-8859-1 - 7-битовая кодировка.
Даже самый дурацкий замысел можно воплотить мастерски
Deady
Сообщения: 193
Зарегистрирован: 17 фев 2004, 13:13
Откуда: Москва
Контактная информация:

тут проблема похоже в другом.
s1 = Integer.toString(text.getBytes("windows-1251")[0]); - это я делаю во всех сервлетах, просто в одних это работает, в других - нет. почему так - я хз. возможно криво стоит винда, возможно криво стоит томкат.
есть подозрение, что если все сервлеты перекинуть на другую машину, то они опять работать не будут, и начнется снова подгонка кодировок.

рядом где-то ветку создавал: выводится excel лист. если он меньше килобайта (грубо говоря, точно не считал), то Excel показывает его в русской кодировке, а если больше - то в турецкой. Это же маразм какой-то!!

-6 я ксати тоже получал.
Ответить