- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在我的应用程序上处理希伯来语字符。我的应用程序构建如下:
带有 java servlet、jsp 的 ui。
带有 java servlet、mysql 的服务器。
我的应用程序所做的是通过 UI 获取数据,创建一个 javascript 对象,使用 JSON.stringify 将其转换为 JSON 字符串,然后使用带有 xhr.send("data=".concat(jsonString));
的 XMLHttpRequest 发送它。然后 JavaScript 代码将 jsonString 发送到 ui servlet,ui servlet 将其转发到服务器的 servlet,后者使用 hibernate api 将其保存在数据库顶部。
我被这个希伯来语问题困扰了一段时间,所以在研究期间
网络我要做的是:
我的 JSP 文件以
开头 <%@page language="java"
contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
并且有
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
里面<head>
标签。
在 javascript 构造函数中我使用 encodeURIComponent()
可能包含希伯来语字符的字段。
我在 UI servlet 和服务器 servlet 上都有过滤器,如果为 null,则将字符编码设置为 utf-8。
我使用 new String(originalString.toBytes() , "UTF8")
调用 db 对象的构造函数(我正在使用 hibernate)哪里originalString
是可能包含希伯来语字符的字符串。
在我的 persistence.xml 文件中,我有
<property name="hibernate.connection.CharSet" value="utf8mb4" />
<property name="hibernate.connection.characterEncoding" value="utf8" />
<property name="hibernate.connection.useUnicode" value="true" />
一切就绪。
在 Eclipse 中,我已将项目->属性->资源->文本文件编码设置为 UTF8。
我尝试过使用 xhr.overrideMimeType("UTF-8")
和xhr.setRequestHeader("charset" , "utf-8")
但它们没有帮助,所以我将它们注释掉了。
我想就是这样。我实际上有一种感觉,我把事情弄得有点乱了......
现在,当我尝试通过用户界面将希伯来语字符保存在数据库上时:
当我在 ui servlet 上执行 s.o.p 时,我得到这样的东西:"×××¢"
而不是希伯来字符。当我尝试在用户界面上显示 habrew 字符时也是如此。
当我在服务器 servlet 上执行 s.o.p 时,我得到这样的东西:"Ã\u0097Â\u0092Ã\u0097Â\u0096Ã\u0097¢"
在 mysql 工作台上我看到 A
上面有标志,里面有小方 block ,里面有 4 位数字。
我非常希望能够在 mysql 工作台和我的 UI 中查看希伯来语字符。
谢谢!
------------------编辑---------------------
我已添加到我的 servlet
request.setCharacterEncoding("UTF-8");
现在我在我的 ui servlet 中得到希伯来字符。
ui servlet 使用下面的代码将请求转发到服务器 servlet,过去几个小时我一直在尝试调试该代码,但没有成功。我认为问题可能出在这里:
public static String forwardToServer(String servletName ,
Map<String, Object> params ,
String encoding , String method ,
HttpSession session) {
try {
URL url = new URL(settings.LocationSettings.SERVER_ADDRESS.concat(servletName));
StringBuilder postData = new StringBuilder();
for (Map.Entry<String,Object> param : params.entrySet()) {
if (postData.length() != 0) postData.append('&');
/*postData.append(URLEncoder.encode(param.getKey(), encoding));
postData.append('=');
postData.append(URLEncoder.encode(String.valueOf(param.getValue()), encoding));
*/
postData.append(param.getKey());
postData.append('=');
postData.append(String.valueOf(param.getValue()));
}
System.out.println("postData = " + postData.toString());
byte[] postDataBytes = postData.toString().getBytes(encoding);
System.out.println("postDataBytes.toString() = " + new String(postDataBytes));
byte[] postDataBytes2 = postData.toString().getBytes();
System.out.println("postDataBytes2.toString() = " + new String(postDataBytes2));
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
String mySessionCookie = "JSESSIONID="+session.getAttribute(Login.SERVER_SESSION_ID_ATT_NAME);
conn.setRequestMethod(method);
conn.setRequestProperty("Cookie", mySessionCookie);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
conn.setRequestProperty("charset" , "utf-8");
conn.setDoOutput(true);
if (postDataBytes != null && postDataBytes.length > 0) {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8"));
bw.write(postData.toString());
bw.flush();
bw.close();
//conn.getOutputStream().write(postDataBytes);
}
Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), encoding));
StringBuilder sb = new StringBuilder("");
for (int c; (c = in.read()) >= 0;) {
sb.append((char)c);
}
return sb.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
第一个注释掉的部分( /*postData.append ..... encoding));*/
)是我调试的一部分,而 System.out.println("postData = " + postData.toString());
在两种情况下显示完全相同的内容(希伯来语字符显示正确)
还有两个System.out.println("postDataBytes....
显示相同的内容(希伯来语字符正确)。
这个//conn.getOutputStream().write(postDataBytes);
注释掉的代码是我以前的版本(直到几个小时前),在调试时我将其更改为现有版本。
现在在 ui servlet 中显示为
"race":"לול","flockId":"לול"
在服务器中显示为:
"race":"×\u009c×\u0095×\u009c","flockId":"×\u009c×\u0095×\u009c"
(调用 s.o.p 时)
现在我又陷入困境了......
------------------------编辑2-------------------- -----
为了尝试了解问题到底出在哪里,我将 HTTP post 请求直接发送到服务器的 servlet。当这样做时,我)仍然得到这个:
"race":"×\u009c×\u0095×\u009c","flockId":"×\u009c×\u0095×\u009c"
这意味着问题出在服务器的 servlet 中。只是我找不到问题到底是什么。
就像我之前写的,我打电话request.setCharacterEncoding("UTF-8");
在doPost(HttpServletRequest request, HttpServletResponse response)
.
有什么想法吗?
最佳答案
某些内容正在转换为“Unicode”,而不是“UTF-8”。我从 \u0097
(等)中看到了这一点。但是,更糟糕的是,这不是有效的 Unicode“代码点”。
¡
是 ¢
请提供希伯来语样本和相应的乱码。似乎有两件事正在密谋弄乱您的文本;如果只完成一次转换,那么逆向工程就很困难。
帮助调试情况的另一件事是SELECT HEX(col) ...
来查看存储的内容。
这个Q&A可能有助于修复它。如果没有,请提供更多信息。
更多
(我使用 MySQL 的字符集来执行这项研究。这可能(也可能不)与相关文档中使用的编码匹配。)
לול
,以utf8编码为D79CD795D79C
;如果 Mojibaked 变成 לול
。所以,我可以看到 ×
以及 9C
和 95
。但是如何获取一些个字节进行传输,并将一些字节转换为unicode(\u...
)是一个谜。
如果您正在使用任何转换函数,请将其删除。
cp1250、cp1256、cp1257、latin1、latin2、latin5、latin7 将十六进制 D7
视为“×”。
希伯来语将十六进制 AA
视为 ×
。×
的 utf8 编码为十六进制 C397
。
cp1250、cp1251、cp1256、cp1257、dec8、geostd8、希腊语、希伯来语、latin1、latin5、latin7 将十六进制 BB
视为 »
。
latin2 将十六进制 BB
视为 ť
。
\u0095
是“消息等待”。一般来说,\u009x
不应出现在文本中。
线索不一致,所以我仍然对“你是如何从这里到那里”感到困惑。
关于javascript - 如何在 javascript、javaservlets、mysql 和 back 中使用 utf8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46750793/
我是一名优秀的程序员,十分优秀!