0

私は私の友人の一人を助けています。彼はJSF2.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}">fullNameJava Beanで値をSystem.out.println("my name while entering is " + fullName);mとして出力すると、出力はとして取得されmy name while entering is ???????????? ????ます。

これは、データの入力中に問題があることを意味します

誰かがODDの進行を助けることができますか?

4

1 に答える 1

3

しかし、彼は出力をおめでとうと見ています、Ù?ظاÙ?تÙ?Ù?Ù?Ø©Ù?تÙ?Ù?Ù?صدÙ?Ù?Ù?Ù?بÙ?ئةが正常に追加されました。データベースの文字が正しく設定されているのに、なぜ彼がそのようになるのかわかりません。

これは文字化けとして知られています。これはDBエンコーディングの問題ではなく、HTTPエンコーディングの問題です。あなたがしたようにPOSTリクエストの文字エンコードを設定することは確かに適切な解決策です。


編集1:JSFフィルターで、も追加req.setCharacterEncoding("UTF-8");しましたdoFilter()。まだデータベースにありますか???????????

疑問符は、接続の両側が独自のエンコーディングを認識している場合に発生します。片面のエンコードでカバーされていない送信/取得された文字は、疑問符に置き換えられます。ISO-8859-1ではアラビア文字は使用されないため、疑問符に置き換えられます。これが文字化けとの違いです。文字化けでは、反対側で使用されているエンコーディングが実際に文字をサポートしているかどうかを確認せずに文字が送信されます。正しくエンコードされていない文字になってしまい、理解できない文字のシーケンスとして表示されます。

この特定のケースでは、JDBCドライバーはそれ自体がデフォルトでISO-8859-1を使用して文字をDBに送信していることを認識していますが、取得された文字はUTF-8にあります(MySQL JDBCドライバーはDBを参照しません)テーブルエンコーディング(この場合はUTF-8に適切に設定されていますが)。データをDBに送信する前に、UTF-8を使用して文字をデコードするようにJDBCドライバーに明示的に指示する必要があります。これは、次のようにJDBCURLのクエリ文字列パラメータとして定義されるJDBC接続プロパティとして実行されます。

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

コンテナ管理のデータソースを使用している場合は、ユーザー名とパスワードの場合と同じ方法で、これらのプロパティを個別に指定するだけです。

useUnicode=yes
characterEncoding=UTF-8

参照:

于 2012-11-19T11:14:32.633 に答える