显示问题:日语字符无法正常显示

3

我正在从Oracle数据库中获取一个日语字符串并在浏览器上显示它。但是,浏览器上显示的字符像???一样。使用unistr()函数将日语字符串插入到数据库中。

INSERT INTO MESSAGES (MESSAGE_ID,MESSAGE) VALUES (1,unistr('\0041\0063\0063\0065\0073\0073\0020\004d\0061\006e\0061\0067\0065\006d\0065\006e'));    

当我打印System.getProperty("file.encoding")时,我的jvm日志中出现了ISO8859-1

select * from v$nls_parameters where parameter in ('NLS_CHARACTERSET') 在我的数据库中返回UTF8

有什么方法可以使日文字符正确显示吗?

6个回答

2
"最初的回答":你正在尝试将ISO8859-1转换为utf-8。
如果在struts中遇到上述问题,请在java.jsp页面上使用以下代码。
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>

1
尝试更改您的浏览器语言设置。您可以使用 Firefox 完成此操作。

1

服务器响应浏览器的字符似乎在Unicode编码方面被错误地指定了。如果您使用的是Tomcat,这个主题有一个相当详细的SO问题。请注意,您必须使用UTF-8而不是ISO-Latin-1/ISO-8859-1,因为日语字符不属于Latin-1字符编码。

除了关于Unicode编码的提示之外,您可能还想检查一些事情:

  • 数据库中的数据是否以您所需的方式存储?您可以使用像Oracle SQL Developer这样的工具(默认支持Unicode;我不确定是否支持日文字体,但您可以切换到它们)来查看数据库表的内容。
  • 您是否为应用程序服务器JVM设置了正确的编码?
  • 您是否安装了适用于浏览器的日文字体,并使用了日本语言环境来查看页面?

如果您已经排除了以上所有可能性,则Unicode字符(包括日语字符)正在转换为无法理解的格式。


1

检查清单:

  1. 检查您的浏览器语言环境(如duffymo所建议的)。
  2. 您是否已安装亚洲字体(如果运行Windows)。 浏览到www.yahoo.co.jp-您能看到日文字符吗?
  3. 如果您有日文字体和日语环境,请尝试直接运行以下语句:

select unistr('\0041\0063\0063\0065\0073\0073\0020\004d\0061\006e\0061\0067\0065\006d\0065\006e') from dual

如果第3步成功,则表中消息字段的文件编码不正确。


我已经安装了必要的字体,并且可以在yahoo.co.jp上查看日文字符。我运行了查询并可以看到日文字符。我尝试过以某种方式将mydatabasestring转换为正确的日文字符串,但仍然只出现问号(???)。这里有什么我错过的东西吗? - bhavani

0
如果您在Web浏览器中看到了???,那么像其他人建议的更改浏览器的区域设置/字符集真的不会有太大帮助。只有当您看到、空方块和/或Mojibake时,它才可能确实有帮助。同时安装字体也不会有太大帮助。如果没有相应的字体,您在Firefox中将看到带有十六进制码的方块,在IE中则是空方块,而不是???
在此情况下,???只有一个原因:您正在使用错误的编码方式将这些字符写入HTTP响应中。普通的Web服务器会用?替换未知字符。 Web浏览器并不会这样做,它只是按原样显示它们。实际上,理论上还有另一个可能的原因; 当您插入未知字符时,数据库也会执行相同的操作,但在这里不太可能存在。

不清楚您使用的视图技术是什么,但由于您提到了Java和Web浏览器,我会假设您正在使用JSP/Servlet(请在以后的提问中明确标记,以便吸引正确的受众)。

如果您正在使用JSP显示这些字符,则需要在JSP页面顶部添加以下内容,以指示Servlet容器使用正确的编码方式写入这些字符:

<%@ page pageEncoding="UTF-8" %>

如果您正在使用Servlet手动编写这些字符,则需要在向其写入任何字符之前按如下方式设置HTTP Servlet响应以使用正确的编码:

response.setCharacterEncoding("UTF-8");

另请参阅:


0
  1. 首先,\0041\0063\0063\0065\0073\0073\0020\004d\0061\006e\0061\0067\0065\006d\0065\006e 似乎不是一个有效的日语 UTF-8 字符串(它在 UTF-8 中表示 "Access Managemen")。 如果你想在 CHAR 列中插入日语字符,请尝试使用 unistr('\306b\307b\3093\3054')(它在 UTF-8 中表示 "にほんご")。
  2. JDBC 驱动程序会识别 DB 实例的 NLS_CHARACTERSET,所以此时如果你使用调试器查看 resultSet.getString(2); 的返回值,你将看到已插入的日语字符串。
  3. 要使用 JSP 将 UTF-8 字符串写入 HTML,您必须在 JSP 文件头部编写 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>。 JSP 的默认编码是 ISO-8859-1(请参见 https://docs.oracle.com/cd/E17802_01/j2ee/j2ee/1.4/docs/tutorial-update6/doc/WebI18N5.html),它无法处理日语字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接