Как отобразить тайскую букву (и другую азиатскую / арабскую букву) с помощью XPAGES DesignerFacesServlet - PullRequest
0 голосов
/ 30 апреля 2019

Я попытался создать сервлет XSP и хочу полностью поддерживать тайский язык (и / или другое азиатское / арабское письмо) в моем веб-приложении.

Этот скрипт является настроенной версией https://frostillic.us/blog/posts/159496067A27FD3585257A70005E7BC1

Среда: Domino 9.0.1 FP6, Windows Server 2008

package com.testing.servlet;

import java.io.*;
import java.util.*;
import com.ibm.commons.util.StringUtil;
import com.ibm.xsp.webapp.DesignerFacesServlet;
import javax.faces.context.FacesContext;
import javax.servlet.*;
import javax.servlet.http.*;
import lotus.domino.*;


public class Testing extends DesignerFacesServlet {

    //Session
    private static Session getCurrentSession(FacesContext context) {
        return (Session) context.getApplication().getVariableResolver()
                .resolveVariable(context, "session");
    }

    private void incinerate(Object... dominoObjects) {
        for (Object dominoObject : dominoObjects) {
            if (null != dominoObject) {
                if (dominoObject instanceof Base) {
                    try {
                        ((Base)dominoObject).recycle();
                    } catch (NotesException e) {
                        System.out.println("[FAILED TO RECYCLE]");
                        e.printStackTrace();
                    }
                }
            }
        }
    }


    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        HttpServletRequest req = (HttpServletRequest)servletRequest;
        HttpServletResponse res = (HttpServletResponse)servletResponse;
        ServletOutputStream out = res.getOutputStream();
        FacesContext facesContext = this.getFacesContext(req, res);
        Session session = null;
        Database database = null;
        View view = null;
        Document doc = null;
        try {
            session = getCurrentSession(facesContext);
            database = session.getCurrentDatabase();
            view = database.getView("lkBehavior");
            doc = view.getDocumentByKey("pBehavior");
            res.setContentType("text/plain");
            res.setCharacterEncoding("utf-8");
            out.println("start");
            Map<Object, Object> sessionScope = facesContext.getExternalContext().getSessionMap();
            sessionScope.put("counter", sessionScope.containsKey("counter") ? (Integer)sessionScope.get("counter") + 1 : 1);
            out.println("Counter: " + sessionScope.get("counter"));
            Map<String, String[]> param = req.getParameterMap();
            for(String key : param.keySet()) {
                out.println(key + " => " + StringUtil.concatStrings(param.get(key), ';', false));
            }
            out.println(doc.getItemValueString("values")); // field values contains thai letter
            out.println("done");            
        } catch(Exception e) {
            e.printStackTrace(new PrintStream(out));            
        } finally {
            out.close();
            incinerate(doc,view,database,session);
            if(facesContext!=null){
                facesContext.responseComplete();
                facesContext.release();
            }
        }
    }
}

И результат

start
Counter: 5
???????????? // thai letter display as ????
done

Как отобразить тайское письмо вместо ????

1 Ответ

3 голосов
/ 30 апреля 2019

У меня была похожая проблема при работе с норвежскими персонажами.Был в состоянии исправить это, переключившись на PrintWriter вместо ServletOutputStream:

HttpServletResponse res = (HttpServletResponse) servletResponse;
HttpServletRequest req = (HttpServletRequest) servletRequest;

res.setContentType("application/json; charset=UTF-8;");

//use a PrintWriter here, since we also have to deal with UTF-8 characters
PrintWriter out = res.getWriter();

Только что сделал быстрый тест с тайским и арабским языками, и это, кажется, работает.

...