当我将数据 [希伯来语字符] 从浏览器传输到 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
MySQL DB
« 变化 Collation数据库名称|表到utf8_general_ci
和 Configuration settings file为了支持 Unicode。
MySQL 的其他几种语言接口(interface)都基于 C 客户端库。 mysql-connector-java [ 5.1.34
]
测试查询:
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 ;
样本 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,您需要进行以下更改:
- 在您的
<Connector>
上设置 URIEncoding="UTF-8"在 server.xml 中。
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
- 使用字符编码
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>
- 更改所有 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/