4

MySql データベースにデータを取得して保存する多言語 Java アプリケーションがあります。

テーブル照合をutf-8-general-ciとして保持しています

JDBC 接続の場合、 useUnicode=true&characterEncoding=UTF-8パラメーターを使用します。

The characters like ® get displayed properly but chinese chars are messed up.

JVM引数の追加 時 -Dfile.encoding=UTF8

中国語の文字は表示されますが、® などの文字は表示されません。

異なる言語から入力されたすべての Char を表示するにはどうすればよいですか。

編集:

入力データは、ByteBuffer の get メソッドによって処理される UDP パケットから取得されます。

そして、このように実装された getString メソッド。

public String getString() {
    byte[] remainingBytes = new byte[this.byteBuffer.remaining()];
    this.byteBuffer.slice().get(remainingBytes);
    String dataString = new String(remainingBytes);
    int stringEnd = dataString.indexOf(0);

    if(stringEnd == -1) {
        return null;
    } else {
        dataString = dataString.substring(0, stringEnd);
        this.byteBuffer.position(this.byteBuffer.position() + dataString.getBytes().length + 1);

        return dataString;
    }
}
4

1 に答える 1

1

MYSQL内で直接文字を試すと、Javaがそこに配置した場合にのみ機能すると述べていますが、それは正しくありません。

コードでこれらの文字を検索し、それらをテキスト ファイルまたは std にダンプして、テキスト std 出力と db に送信されたものを比較する短いテストを試みましたか?

また、何が送信されたかを確認するために、db トランザクションを保存する価値があります。

mysql 構成に関する限り、テーブルと mysql 自体が utf-8 モードで実行されていることを確認してください。

[client]
default-character-set=utf8

# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
default-character-set=utf8
default-collation=utf8_general_ci
character-set-server=utf8
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'

[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci
character-set-server=utf8
collation-server=utf8_general_ci

以下で実行した各 DB 名に対して上記が /etc/mysql/my.cnf に配置されていることを確認して、テーブルをダンプし、各テーブルに変更行を追加して utf8 に変換します。

select CONCAT("Alter Table `",  i.TABLE_NAME, "` CONVERT TO CHARACTER SET utf8;") as MySQLCMD from information_schema.TABLES i where i.TABLE_SCHEMA =
"userbase" INTO OUTFILE '/tmp/userbase.csv' ;

試してみる価値のある他のこと - 特に、このサーバーに utf-8 で書き込む場合:

  1. Linux システム環境:

    Unix ロケール ロケール

    LANG=en_GB.UTF-8 LC_CTYPE="en_GB.UTF-8" LC_NUMERIC="en_GB.UTF-8" LC_TIME="en_GB.UTF-8" LC_COLLATE="en_GB.UTF-8" LC_MONETARY="en_GB.UTF- 8" LC_MESSAGES="en_GB.UTF-8" LC_PAPER="en_GB.UTF-8" LC_NAME="en_GB.UTF-8" LC_ADDRESS="en_GB.UTF-8" LC_TELEPHONE="en_GB.UTF-8" LC_MEASUREMENT=" en_GB.UTF-8" LC_IDENTIFICATION="en_GB.UTF-8" LC_ALL=

これを修正するには

 sudo dpkg-reconfigure locales    select en_GB.UTF-8
 update-locale LANG=en_GB.UTF-8

サービスが utf-8 をユーザーとして選択するようにボックスを再起動します。完全にログアウトして再度ログインし、再起動する前にロケールを確認して、機能することを確認します。

これで、ローカル ssh で日本語を入力できるようになります (設定で putty utf-8 を選択する必要がある場合)。

  1. Tomcat: URIEncoding="UTF-8" を追加

私も追加しました

 <Connector port="8009"......
           protocol="AJP/1.3"  URIEncoding="UTF-8" />

3.2 ローカル サイトの web.xml (WEB-INF 内) web.xml (これが必須かどうか不明)

<web-app>
    <filter>
        <filter-name>charsetFilter</filter-name>
        <filter-class>filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>

次に、マッピングを探して追加します。

 <!-- Define filter mappings for the defined filters -->
<filter-mapping>
<filter-name>charsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

適切な utf-8 エディター (utf-8 を有効にするオプションを備えたメモ帳 ++) または kate などで udp 文字列を保存および表示する価値のある特定の文字破損の問題に遭遇しました。

また、さまざまな utf-8 文字をテストします。動作する文字と、標準出力またはファイル経由で動作しない可能性のある文字です。

http://www.fileformat.info/info/unicode/char/search.htm

文字が同じであることを確認して ください http://www.fileformat.info/info/unicode/char/00ae/index.htm

于 2012-09-09T15:42:16.710 に答える