当前位置: 首页 > 面试题库 >

为什么阿拉伯字母不插入数据库?

吕鸿文
2023-03-14
问题内容

我正在帮助我的一位朋友。他正在使用JSF 2.0和mysql创建Web应用程序。

在创建数据库时,他使用了以下查询。

CREATE DATABASE dbName DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

截止日期网站运行良好。今天,客户尝试输入阿拉伯文字,他们说输出结果很奇怪。我朋友做的是在将数据输入到DB之后,他还在另一页上打印了相同的数据Congratulations, XYZ ABC is added successfully。但是他认为输出为Congratulations, Ù?ظاÙ? تÙ?Ù?Ù?Ø© Ù?تÙ?Ù?Ù? صدÙ?Ù? Ù?Ù?بÙ?ئة is added successfully。我不明白为什么正确设置数据库字符后他会得到这样的信息。

web.xml的 内容如下。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            600
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
    <filter>
        <filter-name>restrict</filter-name>
        <filter-class>com.sac.filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>restrict</filter-name>
        <url-pattern>*.xhtml</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>MyFacesExtensionsFilter</filter-name>
        <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>MyFacesExtensionsFilter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>

    <servlet>
        <servlet-name>DisplayImage</servlet-name>
        <servlet-class>com.sac.databean.DisplayImage</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DisplayImage</servlet-name>
        <url-pattern>/DisplayImage</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>SaveMyImage</servlet-name>
        <servlet-class>com.sac.databean.SaveMyImage</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SaveMyImage</servlet-name>
        <url-pattern>/SaveMyImage</url-pattern>
    </servlet-mapping>

<!-- for not using css and js of default richfaces   -->
    <context-param>
        <param-name>org.richfaces.SKIN</param-name>
        <param-value>plain</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.LoadStyleStrategy</param-name>
        <param-value>None</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.enableControlSkinning</param-name>
        <param-value>false</param-value>
    </context-param>
<!-- for not using css and js of default richfaces   -->

</web-app>

在每个 .xhtml 页面上,他都有<?xml version='1.0' encoding='UTF-8' ?>

如果您还有其他需要,请告诉我。

编辑1

在我的JSF过滤器中,我还添加req.setCharacterEncoding("UTF-8");doFilter()。我仍然在数据库中???????????

编辑2

在JSF页面中<h:inputText value="#{PersonalInformationDataBean.fullName}">,当我fullName在Java bean
中将值打印为System.out.println("my name while entering is " + fullName);m时,输出为my name while entering is ???????????? ????

这意味着输入数据时出现问题

有人可以帮忙ODD吗?


问题答案:

但是他认为输出是“恭喜”,¸?ظاÙ?
Ø©?Ù?Ù?Ø©Ù?تÙ?Ù?Ù?صدÙ?Ù?Ø?Ù?بÙ?ئة已成功添加。我不明白为什么正确设置数据库字符后他会得到这样的信息。

这就是Mojibake。这不是数据库编码问题,而是HTTP编码问题。像您一样设置POST请求字符编码确实是正确的解决方案。

编辑1:在我的JSF过滤器中,我还添加req.setCharacterEncoding("UTF-8");doFilter()。仍然在数据库中,我看到了???????????

当出现问号 两个 连接的双方都 意识到
自己的编码。一侧编码未涵盖的已发送/检索的字符将替换为问号。ISO-8859-1中没有阿拉伯字符,因此已被问号代替。这与Mojibake的区别在于,在发送字符时无需检查对方使用的编码是否真正支持该字符。您最终将得到错误编码的字符,这些字符将自身呈现为难以理解的字符序列。

在这种特殊情况下,JDBC驱动程序本身知道它默认情况下使用ISO-8859-1来将字符传输到DB,而检索到的字符是UTF-8(MySQL
JDBC驱动程序不会查看数据库)表编码,即使您已将其正确设置为UTF-8)也是如此。在将数据传输到DB之前,您需要明确告诉JDBC驱动程序使用UTF-8解码字符。这将作为JDBC连接属性来完成,这些属性在JDBC
URL中定义为查询字符串参数,如下所示:

jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8

如果您使用的是容器管理的数据源,则只需使用与用户名和密码相同的方式分别指定这些属性

useUnicode=yes
characterEncoding=UTF-8

也可以看看:

  • Unicode-如何正确获取字符?


 类似资料:
  • 问题内容: 使用JDBC驱动程序从Java中的oracle中读取oracle阿拉伯字符时遇到问题,主要问题是我找不到正确的字符编码来获取正确的数据,但是我使用此方法手动解决了问题: 此方法可以给我正确的字符,如数据库中显示的那样,但是当我尝试更新/插入阿拉伯数据时,它将保存错误的字符。例如:我的文本在数据库中另存为“ ?????????” 而不是“مرحبا”。 这是我连接到oracle数据库的方

  • 我正面临着从Oracle数据库12c获取阿拉伯语内容的问题,我已经回答了大多数问题,但没有任何问题与我一起工作。 我的阿拉伯字符返回如下“?????” 即使在java上,当我获得数据时,它也不会返回阿拉伯值 windows 10笔记本电脑(使用windows 10管理用户登录) Oracle 12C(使用系统用户登录) Java版本“1.8.0_152” 我在这里和网上找到了很多问题,比如: 无法

  • 问题内容: 我有一个Java应用程序,想要将阿拉伯语单词插入mysql数据库,我的代码看起来像 但是它只插入’??????’。我现在能做什么? 问题答案: 在db变量声明后添加此变量: 然后修改您的行: 至

  • 本文向大家介绍java实现阿拉伯数字转汉字数字,包括了java实现阿拉伯数字转汉字数字的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java实现阿拉伯数字转汉字数字的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 如何在Java中从字符串中删除所有非字母数字阿拉伯字符?

  • 我正在尝试使用最新的雅虎天气apihttps://weather-ydn-yql.media.yahoo.com/forecastrss它工作得很好,但当我设置语言(lang=ar AE)时,它返回带问号的json响应,而不是阿拉伯字符。例如“城市”:“城市”对于英语来说,这是可以的。 我没看到留档里有关于utf设置的东西 当我打开雅虎的天气页面https://www.yahoo.com/news