【问题标题】:Storing and displaying ₹ (rupee symbol) html (xslt) -> java -> Sql Server 2016存储和显示₹(卢比符号) html (xslt) -> java -> Sql Server 2016
【发布时间】:2016-07-25 23:15:20
【问题描述】:

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

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

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

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

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

java (jdbc) 更新字段。我使用 Sql Server Management Studio 查看该字段,它在文本和网格视图中都显示 â?¹。 我知道 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 req,但它什么也没做:

try {

            req.setCharacterEncoding("UTF-8");

} 捕获(UnsupportedEncodingException ex){

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

}

Sql 服务器:

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

显示html:

â?¹ 会在使用此更新值引用屏幕时显示。

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

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

【问题讨论】:

    标签: java sql-server tomcat xslt currency


    【解决方案1】:

    除非链中的每个工具,包括你用来查看中间结果的任何工具,都支持 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 声明。

    【讨论】:

    • 如果使用 Sql Server Management Studio 查看字段时显示为â?¹,则在数据库中正确。
    • 如果将 Management Studio 配置为使用 ISO-8859-1 可能是正确的。也可能是数据库配置不正确,但该字段仍包含正确的 3 字节序列的卢比符号。 OP 没有提供足够的细节来确定工具链的哪些部分配置错误。
    • 这将表明:“我知道 SSMS 可以显示此符号,因为我可以直接插入它并且它可以工作。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多