java - 存储和显示 ₹(卢比符号)html (xslt) -> java -> Sql Server 2016

标签 java sql-server tomcat xslt currency

我很难让 html 页面获取卢比符号 (₹),将其存储到 SQL Server 2016 数据库中,然后检索它以进行显示。

这里需要注意的是,我需要输入实际符号而不是 html 版本。

该页面的基本流程是管理员可以通过 Web 界面向应用程序添加新货币。有一个文本框,其中 他们将输入实际的卢比符号 ₹ 并点击提交。然后通过 HttpServletRequest 将参数传递给 Java 后端。 Java 后端只是将此值插入/更新到字段 nchar(10) 中的 SQL Server 2016 表。

当页面刷新时,它会对该表运行选择并显示所有有效货币。

问题在于,当 java 应用程序从 HttpServletRequest 请求对象中检索时,符号 ₹ 变为 â?¹。我可以在 调试器,我明白这可能是由于我的调试器无法显示它,所以我继续。

java (jdbc) 更新字段。我使用 Sql Server Management Studio 查看该字段,它在文本和 GridView 中都显示 â?¹。 我知道 SSMS 可以显示这个符号,因为我可以直接插入它并且它可以工作。所以看起来信息在 html>java 请求中丢失了。

网页本身是遗留的,使用 xslt 构建。我在下面添加了更多关于我所处位置的详细信息。

网站运行在tomcat 8上,页面使用xslt构建,后端是java。

在前端的 EditCurrency 页面中有一个文本字段。我在符号字段中输入 ₹ 并点击提交。

用于构建前端的xslt页面的相关片段是:

<!--header indicates page is utf8-->

            <xsl:param name="csrfToken"/>

            <xsl:param name="currencyFormatError"/>

            ...



            <!-- on submission the EditCurrency java class is called. method=POST indicates it should allow UTF8 request URL's as is my understanding-->



            <form id="cmanager" name="cmanager" onsubmit="return(vNewCurrency())" action="../servlet/webpay.website.admin.EditCurrency" method="POST">

                                                                                                                            <input name="csrfToken" type="hidden" value="{$csrfToken}"/>

                                                                                                                            <table width="100%" cellpadding="0" cellspacing="0" border="0">

tomcat 8 服务器的 server.xml 设置为 UTF-8 编码。我知道这允许请求/响应处理 UTF-8:

    <Connector port="8080" protocol="HTTP/1.1"

           connectionTimeout="20000"

           redirectPort="8443" URIEncoding="UTF-8" />

Java 类 EditCurrency:

//Retrieves symbol from the HttpServletRequest req

            //symbol returns â?¹

            String symbol = (String) getParameter(PARAM_SYMBOL); 

我还尝试使用以下方法设置 HttpServletRequest 请求,但它什么都不做:

try {

            req.setCharacterEncoding("UTF-8");

} 捕获(UnsupportedEncodingException 前){

            java.util.logging.Logger.getLogger(EditCurrency.class.getName()).log(Level.SEVERE, null, ex);

SQL 服务器:

值 â?¹ 出现在 nchar(10) 字段中。

显示 html:

â?¹ 会在屏幕显示更新后的值时显示。

所以问题是我该如何解决这个问题!!??

我曾考虑过某种包含所有货币及其显示值等的引用表,但这似乎不是正确的做法。

最佳答案

除非链中的每个工具,包括您用来查看中间结果的任何工具,都支持 UTF-8,否则您在某些时候会看到垃圾。

卢比符号的 Unicode 代码点是 0x20B9,UTF-8 编码为三个字节 0xE2 0x82 0xB9。如果您尝试在使用 ISO-8859-1 的工具中显示它,您会看到

0xE2 = â   
0x82 = ? (there is no character in ISO-8859-1 for code 0x82, so you see a question mark)
0xB9 = ¹

所以看起来数据库中的符号是正确的,但你显示的不正确。

要“解决”这个问题,您必须确保您的工具都设置为 UTF-8,并且 Web 服务器配置为在它发送的 HTML 中包含 UTF-8 声明。

关于java - 存储和显示 ₹(卢比符号)html (xslt) -> java -> Sql Server 2016,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38578783/

相关文章:

java - Maven测试组装的jar

sql - 为什么要在数据库中创建 View ?

sql-server - Postgresql 触发器通过 ODBC 将数据写入 SQL Server?

java - 将应用程序从 websphere 迁移到 tomcat - 初始化程序错误

java - 如何计算Java应用程序中的页面加载时间

node.js - 服务器在不同框架和语言中的含义是什么?

java - avahi 无法找到由 JmDNS 创建的服务

java - 使用 Java 8 流,如何将 Map<String, Map<String, List<Person>>> 转换为 Map<Integer, Map<String, Integer>>?

java - Apache Maven 程序集插件无法与 OSGi bundle 一起使用

sql - 使用 Azure Blob 存储的扩展事件文件存储