Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > проблема с кодировкой


Автор: AntonioBanderaz 12.1.2006, 18:17
Написал промтенькое приложение, которое форматирует текст для веба, используя сервис студии Лебедева
Но возникают проблемы с русским текстом, как мне перекодировать секст из одной кодировки в другую?
я пробовал сделать это так
Код

Charset charset = Charset.forName(this._encoding);
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();
Text = decoder.decode(encoder.encode(CharBuffer.wrap(Text))).toString();

но что-то не получилось.

Вот полный код проекта, может ещё где надо будет менять...
класс RemoteTypograf
Код

package net;

import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.charset.*;
/**
 * @author AntonioBanderaz
 *
 */
public class remoteTypograf {
    private String _entityType = "4";
    private String _useBr = "1";
    private String _useP = "1";
    private String _maxNobr = "3";
    private String _encoding = "UTF-8";
    
    
    /**
     * 
     */
    public remoteTypograf(String Encoding) {
        if(Encoding.length() > 0) 
            this._encoding = Encoding;
    }
    
    public void HTMLEntries(boolean prop) {
        if(prop == true) 
            this._entityType = "1";
    }
    
    public void XMLEntries(boolean prop) {
        if(prop == true) 
            this._entityType = "2";
    }
    
    public void MixedEntries(boolean prop) {
        if(prop == true) 
            this._entityType = "4";
    }
    
    public void NoEntries(boolean prop) {
        if(prop == true) 
            this._entityType = "3";
    }
    
    public void br (boolean prop)
    {
        this._useBr = prop ? "1" : "0";
    }
    
    public void p (boolean prop)
    {
        this._useP = prop ? "1" : "0";
    }
    
    public void noBr(String prop)
    {
        this._maxNobr = (prop.length() > 0) ? prop : "0";
    }
    
    public String DoRequest(String Text){
        try {
            // Construct data
            Text = Text.replace("&", "&");
            Text = Text.replace("<", "&lt;");
            Text = Text.replace(">", "&gt;");
            
            Charset charset = Charset.forName(this._encoding);
            CharsetDecoder decoder = charset.newDecoder();
            CharsetEncoder encoder = charset.newEncoder();
            Text = decoder.decode(encoder.encode(CharBuffer.wrap(Text))).toString();
            
            String Data = "<?xml version=\"1.0\" encoding=\"" + this._encoding + "\"?>";
                Data += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
                Data += "<soap:Body>";
                Data += "<ProcessText xmlns=\"http://typograf.artlebedev.ru/webservices/\">";
                Data += "<text>" + Text + "</text>";
                Data += "<entityType>" + this._entityType + "</entityType>";
                Data += "<useBr>" + this._useBr + "</useBr>";
                Data += "<useP>" + this._useP + "</useP>";
                Data += "<maxNobr>" + this._maxNobr + "</maxNobr>";
                Data += "</ProcessText></soap:Body></soap:Envelope>";
            
            
            // Create a socket to the host
            String hostname = "typograf.artlebedev.ru";
            InetAddress addr = InetAddress.getByName(hostname);
            Socket socket = new Socket(addr, 80);
        
            // Send header
            BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), this._encoding));
            wr.write("POST /webservices/typograf.asmx HTTP/1.1\r\n");
            wr.write("Host: typograf.artlebedev.ru\r\n");
            wr.write("Content-Length: " + Data.length() + "\r\n");
            wr.write("Content-Type: text/xml\r\n");
            wr.write("SOAPAction: \"http://typograf.artlebedev.ru/webservices/ProcessText\"\r\n");
            wr.write("\r\n");
        
            // Send data
            wr.write(Data);
            wr.flush();
        
            // Get response
            BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String response = "";
            String line;
            while ((line = rd.readLine()) != null) {
             response += line;
            }
            wr.close();
            rd.close();
            
            //return response;
            
            response = response.substring(response.indexOf("<ProcessTextResult>") + 19, response.indexOf("</ProcessTextResult>"));
            response = response.replace("&gt;", ">");
            response = response.replace("&lt;", "<");
            response = response.replace("&amp;", "&");
            
            
            return response;
        } catch (Exception e) {
         return e.getMessage();
        }
    }
}


Внешнее оформление
Код

package net;
import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

/**
 * @author AntonioBanderaz
 *
 */
public class connectDialog {
    
    final private Shell sh;
    private Text text;
    
    
    public connectDialog(Display ds) {
        GridLayout layout= new GridLayout();
        layout.numColumns = 1;
        
        
        sh = new Shell(ds, SWT.SHELL_TRIM);    
        sh.setLayout(new FillLayout());
        this.createTextComposite();
        this.menu();
        sh.addShellListener(new ShellAdapter() {
            public void shellClosed(ShellEvent e) {
                e.doit = true;
            }
        });
        sh.setSize(300, 300);
        sh.open();
        while(!sh.isDisposed()){
            if(!ds.readAndDispatch())
                ds.sleep();
        }
        ds.dispose();
    }
    
    private void createTextComposite() {
        Composite composite = new Composite(sh, SWT.NULL);
        FillLayout layout= new FillLayout();
        layout.spacing = 10;
        composite.setLayout(layout);
        text = new Text(composite, SWT.MULTI | SWT.BORDER | SWT.WRAP);
    }
    
    private void menu() {
        Menu winMenu = new Menu(sh, SWT.BAR);
        MenuItem send = new MenuItem(winMenu, SWT.CASCADE);
        send.setText("Послать");
        MenuItem exit = new MenuItem(winMenu, SWT.CASCADE);
        exit.setText("Выход");
        
        send.addSelectionListener(new SelectionAdapter()
            {
                public void widgetSelected(SelectionEvent e)
                {
                    send_selected(e);
                }
            });
        exit.addSelectionListener(new SelectionAdapter()
                {
                    public void widgetSelected(SelectionEvent e)
                    {
                        System.exit(0);
                    }
                });
        sh.setMenuBar(winMenu);
    }
    
    private void send_selected(SelectionEvent e) {
        remoteTypograf rt = new remoteTypograf("CP1251");
        this.text.setText(rt.DoRequest(this.text.getText()));
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new connectDialog(new Display());
    }
}

Автор: LSD 12.1.2006, 21:54
1. Вот эту ересь
Код
Charset charset = Charset.forName(this._encoding);    
CharsetDecoder decoder = charset.newDecoder();    
CharsetEncoder encoder = charset.newEncoder();    
Text = decoder.decode(encoder.encode(CharBuffer.wrap(Text))).toString();

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

2. Поаккуратней с String.replace(), дело в том что входная строка воспринимается как регулярное выражение. Да и по скорости они не ахти, лучше используй StringEscapeUtils из Jakarat Commons Lang.

3. По соглашению принятому в Java с большой буквы пишутся только имена классов, имена переменных и методов с маленькой (исключение: public static final поля пишутся полностю заглавными буквами), подробнее о оформлении кода http://forum.vingrad.ru/index.php?showtopic=55987. Это не придирки, просто трудно код читать.

Автор: AntonioBanderaz 13.1.2006, 15:14
Цитата(LSD @ 12.1.2006, 21:54 Найти цитируемый пост)

По соглашению принятому в Java с большой буквы пишутся только имена классов, имена переменных и методов с маленькой (исключение: public static final поля пишутся полностю заглавными буквами), подробнее о оформлении кода тут. Это не придирки, просто трудно код читать.

Да я не совсем хорошо знаю язык, это моя первая программа.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)