4

我有一个多语言 Java 应用程序,它在 MySql 数据库中获取和存储数据。

我将表格排序规则保留为utf-8-general-ci

对于 JDBC 连接,我使用useUnicode=true&characterEncoding=UTF-8参数。

® 之类的字符可以正常显示,但中文字符却混乱了。

现在

关于添加 JVM 参数 -Dfile.encoding=UTF8

显示中文字符,但不显示像 ® 这样的字符。

我应该怎么做才能显示从不同语言输入的所有字符。

编辑:

输入数据来自 UDP 数据包,由 ByteBuffer 上的 get 方法处理。

和一个像这样实现的 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 的内容?

还值得存储数据库事务以查看发送的内容:

就 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

确保上面已为您在下面运行的每个数据库名称放入 /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 编辑器(notepad++ 带有启用 utf-8 的选项)或 kate 或 kde 上的其他东西中打开保存和查看 udp 字符串的特定字符损坏问题。

还可以通过 std out 或 file on 测试不同的 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 回答