javascript - UTF-8:从 Ajax 客户端到 Tomcat 服务器的希伯来字符集

标签 javascript java tomcat utf-8 character-encoding

当我将数据 [希伯来语字符] 从浏览器传输到 Web 服务时,我遇到了问题。 Browser js 端和 java 端没有问题,但是当我在它们之间传输数据时出现问题。

AJAX - setRequestHeader

var hebrewData = 'יאש';
var encodeData =  encodeURIComponent( hebrew );

console.log('Encoding Before :', hebrewData, '\nAfter :', encodeData);
var xmlhttp = new XMLHttpRequest();

// Method: POST; Encoding type: application/x-www-form-urlencoded (default):
xmlhttp.open("POST","http://localhost:8088/WebApplication/Service", true);          
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("data="+encodeData+"&userid="userid );

保存为 UTF-8 的 Web 服务 Java 文件

String hebrew = "חוּט";     
System.out.println("Lan : "+hebrew);

我已经尝试过这些可能的方法;

XMLHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

从 java getParameter() 开始使用 ISO-8559-1 而不是 UTF-8改了,Tomcat HTTP Connector使用 URIEncoding="UTF-8"(或)useBodyEncodingForURI="true"

In servlet « request.setCharacterEncoding("UTF-8");
tomcat server.xml « <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />

但我无法获得正确的输出。

最佳答案

我已经尝试了这些可能的方法来将数据从 Java 保存到 DB,Servlet 到 DB,下面将逐步清楚地提到。


➩ As Windows OS uses CP1252 character encoding by default. So, changed code page value to 65001 - Unicode (OR) windows-1255 - ANSI Hebrew

  • Java程序
public class My {
    public static void main(String args[]) throws java.io.UnsupportedEncodingException {    
        System.setProperty("file.encoding","UTF-8");
        System.out.println("Default Charset = " + java.nio.charset.Charset.defaultCharset());

        String పేరు = "Yash";
        System.out.println("UNICODE - Identifier[Variable Name] : " + పేరు);

        String hebrew = "יאש";
        System.out.println("UNICODE - Literal[Variable value] : "+ hebrew );

        System.out.println("windows-1255 : " + new String(hebrew.getBytes("UTF-8"), "UTF-8") );
    }   
}

Compiling Java program Manually which is written using Text Editor Notepad++.

即使附加 JAVA_OPTS 也无济于事。当我们编译一个具有 Unicode 字符的 Java 文件时,我们得到这个错误

error: unmappable character for encoding Cp1252
    ➩ As Windows OS uses CP1252 character encoding by default.

D:\Yash>set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
D:\Yash>javac -encoding UTF-8 -target 1.7 My.java 
    «  -encoding <encoding> Specify character encoding used by source files.
    «  -target <release>    Generate class files to support lowest specified version[1.7] and above[1.8]
                            For Example: trywithresource feature of 7 will not work on 6.
D:\Yash>java -Dfile.encoding=UTF-8 My 
    «  -D<name>=<value> set a system property

O/P :- Unable to print UTF-8 characters on console command prompt, So go for Eclipse IDE 
Default Charset = UTF-8
UNICODE - Identifier[Variable Name] : Yash
UNICODE - Literal[Variable value] : ×™×ש
windows-1255 : ×™×ש

From Eclipse Editor

中支持 Unicode Eclipse 保存Workspace|Class文件编码为UTF-8

Class ➩ Project ► properties ► Run/Debug ➤ settings Eccoding - UTF 8 (OR)
WorkSpace ➜ Preferences ► General ► Workspace ► Text file encoding UTF-16

或者将文件保存为另存为UTF-8 enter image description here


MySQL DB « 变化 Collation数据库名称|表到utf8_general_ciConfiguration settings file为了支持 Unicode。

MySQL 的其他几种语言接口(interface)都基于 C 客户端库。 mysql-connector-java [ 5.1.34 ]

  1. 测试查询:

    CREATE TABLE IF NOT EXISTS `unicodeinfo` (
      `id` int(5) NOT NULL AUTO_INCREMENT,
      `UserName` varchar(21) COLLATE utf8_unicode_ci NOT NULL,
      `Language` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
      `Message` varchar(150) CHARACTER SET utf8 NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6 ;
    
  2. 样本 Java Example to insert record .

    public static void insertAutoIncrement_SQL(String UserName, String Language, String Message) {
        String DB_URL = "jdbc:mysql://localhost:3306/test", DB_User = "root", DB_Password = "";
    
        String insertSQL = "INSERT INTO `unicodeinfo`( `UserName`, `Language`, `Message`) VALUES (?,?,?)";
                //"INSERT INTO `unicodeinfo`(`id`, `UserName`, `Language`, `Message`) VALUES (?,?,?,?)";
        int primkey = 0 ;
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            Connection conn = DriverManager.getConnection(DB_URL, DB_User, DB_Password);
    
            String columnNames[] = new String[] { "id" };
    
            PreparedStatement pstmt = conn.prepareStatement( insertSQL, columnNames );
            pstmt.setString(1, UserName );
            pstmt.setString(2, Language );
            pstmt.setString(3, Message );
    
            if (pstmt.executeUpdate() > 0) {
                // Retrieves any auto-generated keys created as a result of executing this Statement object
                java.sql.ResultSet generatedKeys = pstmt.getGeneratedKeys();
                if ( generatedKeys.next() ) {
                    primkey = generatedKeys.getInt(1);
                }
            }
            System.out.println("Record updated with id = "+primkey);
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
    

如果您使用 ConnectionPool DBCP 使用值为 connectionProperties="useUnicode=yes;characterEncoding=utf8;" 的 connectionProperties


  • 部署在 Tomcat server 上的 Java 服务器程序:

    为了完全切换到使用 UTF-8,您需要进行以下更改:

    1. 在您的 <Connector> 上设置 URIEncoding="UTF-8"在 server.xml 中。

    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" 
    redirectPort="8443" URIEncoding="UTF-8"/>
    
    1. 使用字符编码 filter 默认编码设置为 UTF-8。

    <filter>
      <filter-name>CharacterEncoding</filter-name>
      <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
      <filter-name>CharacterEncoding</filter-name>
      <url-pattern>/msg/*</url-pattern>
    </filter-mapping>
    
    1. 更改所有 servlet 以设置响应的内容类型,并将内容类型中的字符集名称包含为 UTF-8。 使用 response.setContentType("text/html; charset=UTF-8")response.setCharacterEncoding("UTF-8") .
@WebServlet(urlPatterns = { "/msg/locale", "/locale" }, loadOnStartup = 1 )
public class UnicodeTest extends HttpServlet {

    private static final long serialVersionUID = 5081877L;

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //response.setCharacterEncoding("UTF-8");

        String unicodeMessage = URLDecoder.decode( request.getParameter("message"), "UTF-8");
                // request.getParameter("message"); // "××ש"
                //new String(request.getParameter("message").getBytes("ISO-8859-1"), "UTF-8");
        System.out.println("Unicode Message :"+ request.getParameter("message") );

        try {
            System.out.println("windows-1255 : " + new String(unicodeMessage.getBytes("UTF-8"), "UTF-8") );
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        UnicodeChars.insertAutoIncrement_SQL("Yash_777", "Telugu", unicodeMessage);

        PrintWriter writer = response.getWriter();
        if( unicodeMessage != null & !unicodeMessage.equals("") ) {
            writer.append("Received Message : "+ URLEncoder.encode( unicodeMessage, "UTF-8"));
        } else {
            writer.append("Not Received any Message.");
        }
        writer.flush();
        writer.close();
    }
}

使用 Javascript 的 Ajax 请求:

var methodHTTP = 'GET'; // "POST", "GET", "PUT"
var serverURL = 'http://localhost:8080/SteamingServlet/msg/locale';
var queryString = 'יאש';  // 'యశ్వంత్ ' //  'यश'
var enobjects = 'message='+ encodeURIComponent( queryString );

var xmlhttp = new XMLHttpRequest();

if( methodHTTP == 'GET' ) {  console.log( "XMLHttpRequest - GET" );

    xmlhttp.open(methodHTTP, serverURL+'?'+enobjects, true);

    xmlhttp.setRequestHeader("Content-type","application/x-javascript; charset=UTF-8");
    xmlhttp.setRequestHeader("Access-Control-Allow-Origin","*");

    xmlhttp.send( );
} else {  console.log( "XMLHttpRequest - POST" );

    xmlhttp.open(methodHTTP, serverURL, true);
    xmlhttp.setRequestHeader("Content-type","application/x-javascript; charset=UTF-8");
    xmlhttp.setRequestHeader("Access-Control-Allow-Origin","*");

    xmlhttp.send( enobjects );
}

xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        console.log("Message :: ", xmlhttp.responseText);
        console.log("Decoded Message ::  ", decodeURIComponent( xmlhttp.responseText ) );

    } else {
        console.log("Status Code : ", xmlhttp.status);
    }
}

关于javascript - UTF-8:从 Ajax 客户端到 Tomcat 服务器的希伯来字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38308963/

相关文章:

javascript - 如果实现了 switch case,我如何退出循环(循环内有一个开关)

java - 显式实现未使用的接口(interface)的缺点

java - 使用 Java + Maven + Jersey2 + Tomcat 8.5 和 IntelliJ IDEA 的 HTTP 404

java - 将 Tomcat 7 80 重定向到 Apache 8080

java - 如何在 tomcat 中运行的 spring boot 应用程序中显示 soap 调用日志

javascript - 如何在以下场景中保留此关键字

javascript - 如何在不使用模板的情况下插入变量?

javascript - 如何将 expo 应用程序连接到 google firestore?

java - 了解 Java 线程、监视器等......

Java AWT旋转球