显示日文字符的问题

时间:2010-07-22 00:24:52

标签: java utf-8 character-encoding

我从Oracle数据库中获取日语字符串并将其显示在浏览器上。但是这些字符在浏览器上显示为???。使用unistr()函数将日语字符串插入DB。

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'));    

当我打印ISO8859-1时,我在jvm日志System.getProperty("file.encoding")中得到了此信息。

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

有关如何正确显示日文字符的任何指示?

6 个答案:

答案 0 :(得分:1)

尝试更改浏览器区域设置。你可以用Firefox做到这一点。

答案 1 :(得分:1)

就Unicode编码而言,服务器对浏览器的响应字符似乎未正确指定。如果您使用Tomcat,则有一个fairly detailed SO question on this topic。请注意,您必须使用UTF-8而不是ISO-Latin-1 / ISO-8859-1,因为日文字符不属于Latin-1字符编码。

除了有关Unicode编码的指针之外,您可能还需要检查以下几点:

  • 数据库中的数据是否以您希望的方式存储?您可以使用Oracle SQL Developer之类的工具(默认情况下支持Unicode;我不确定日语字体,但您可以切换到它们)来查看数据库表的内容。
  • 您是否为应用程序服务器JVM设置了正确的编码?
  • 您是否正在查看为浏览器安装日语字体的页面以及日语区域设置?

如果您排除了以上所有问题,那么Unicode字符(包括日语)将被转换为不可理解的格式。

答案 2 :(得分:1)

清单:

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

    选择   UNISTR( '\ 0041 \ 0063 \ 0063 \ 0065 \ 0073 \ 0073 \ 0020 \ 004D \ 0061 \ 006E \ 0061 \ 0067 \ 0065 \ 006D \ 0065 \ 006E')   来自双重

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

答案 3 :(得分:1)

您正在尝试将ISO8859-1更改为utf-8。

如果以上问题在struts中,请在您的java.jsp页面上使用此代码

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>

答案 4 :(得分:0)

如果您在Web浏览器中看到???,那么按照其他人的建议更改浏览器的区域设置/字符集确实无济于事。只有当您看到,空方块和/或Mojibake时,可能确实有帮助。安装字体也确实无济于事。如果没有它的字体,你会在Firefox中看到里面有十六进制代码的正方形和IE空白正方形,而不是???

???只能有一个原因:您使用错误的编码将这些字符写入HTTP响应。平均网络服务器将?替换未知字符。 webbrowser不这样做,它只是按原样显示它们。 实际上,理论上还有另一个可能的原因;当您插入未知字符时,数据库也会这样做,但这里的内容会被排除在外。

目前尚不清楚您正在使用哪种视图技术,但由于您正在谈论Java和Web浏览器,我将假设您正在使用JSP / Servlet(将来,请提及并标记,这样才能找到合适的观众。)

如果您使用JSP显示这些字符,那么您需要将以下内容添加到JSP页面的顶部,以指示servletcontainer使用正确的编码来编写这些字符:

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

如果你是使用Servlet手动编写这些字符,那么你需要设置HTTP servlet响应以使用正确的编码,如下之前你写任何字符:

response.setCharacterEncoding("UTF-8");

另见:

答案 5 :(得分: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驱动程序识别数据库实例的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),它无法处理日文字符。
相关问题