5

我对 utf-8 编码有疑问。

我使用 Java 从 UTF-8 格式的 MySQL 数据库中检索数据(带有很多中文符号),并将它们放在一些 txt 文件中:(这是一个示例..我有很多数据)

String name = null;
ResultSet res = stat.executeQuery("Some_SQL");
nomeImg = res.getString("value");

PrintWriter = new new PrintWriter(new FileOutputStream("file_name.txt"));
out.println(name);

使用这些 txt 文件,我将创建一些 TextView,用于在我的 Android 应用程序上填充一些活动,但并非所有符号都正确显示:大多数符号是正确的,但有些无法识别,并且显示为黑色里面有一个白色问号的钻石。

我也试过这个:但我得到了最糟糕的结果

byte[] name = null;
ResultSet res = stat.executeQuery("Some_SQL");
nomeImg = res.getString("value").getBytes("UTF-8"):

BufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("file_name.txt"), "UTF-8"));
out.write(new String(name, "UTF-8")+"\n");

有人有什么主意吗?谢谢!

编辑 我连接到我的数据库:

Connection con = DriverManager.getConnection("jdbc:mysql://url:port?useUnicode=true&characterEncoding=utf-8", user, pass);

当我在数据库上执行查询时:

SELECT default_character_set_name 
FROM information_schema.SCHEMATA S 
WHERE schema_name = "schema_name";

我得到结果

utf8

所以我认为 DB 是用 UTF-8 编码的,我与它的连接可以处理 UTF-8

4

4 回答 4

11

您需要弄清楚这发生在哪个阶段:1- 从数据库加载文本的位置,以及 2- 将它们写入文件的位置。

需要注意的一点是,您的数据库必须使用 UTF-8 编码创建,并且您的连接也必须支持它。支持 UTF-8 的 JDBC 连接 url 的示例可以是:

jdbc:mysql://hostname:port/schema?useUnicode=yes&characterEncoding=utf-8

您在 getBytes("UTF-8") 中指定编码后观察到的症状清楚地表明您从数据库中获得的内容不是 UTF-8。

还可以尝试从您怀疑数据所在的编码转换(如 ISO-8859-1):

new String(request.getParameter("value").getBytes("ISO-8859-1"), "UTF-8");
于 2013-02-04T12:19:06.130 回答
1

@houman001 是对的。在这两个过程中,您应该小心。

此外:

几天前我对阿拉伯语文本也有同样的问题。但现在我已经解决了。我已经通过使用 UTF-8 编码将其写入数据库来解决它。并且还使用了我的字体开发人员提供的一些阿拉伯字体。这使我可以根据需要使用阿拉伯语文本。

因此,在解析和从一个数据传输到另一个数据时请小心,并确保它是 UTF-8 编码格式。

希望这件事对你有帮助。

于 2013-02-04T12:27:16.410 回答
1

为了连接到数据库,我将它用于所有 UTF-8 并且效果很好

这是一个你可以使用的类,只需编辑关于你的用户名、密码和数据库名称的信息

String unicode = "?useUnicode=yes&characterEncoding=UTF-8";
    String driverName = "com.mysql.jdbc.Driver";
    String hostName = "localhost";
    String port = "3306";
    String databaseName = "yourDatabaseName";

String userName = "yourusername";
    String password = "yourpassword";
    String databaseType = "jdbc:mysql";
    public Connection con;

    public Database() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = (Connection) DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/yourdatabasename" + unicode,
                    "yourusername", "yourpassword");
        } catch (ClassNotFoundException e) {
            System.err
                    .println("exception Class (" + driverName + ") not found");
            e.printStackTrace();
        } catch (SQLException e) {
            System.err.println("exception Connection URL");
            e.printStackTrace();
        }
    }

当您想将数据从服务器发送到 android 时,试试这个

ServletOutputStream out = response.getOutputStream();
out.println(URLEncoder.encode(yourString,"UTF-8"));

在android(或任何数据接收者)上试试这个

String dd = URLDecoder.decode(yourReturnedData, "UTF-8");

编辑

对于你的代码,你可以添加这个

name = URLDecoder.decode(name, "UTF-8");
于 2013-02-04T12:55:09.700 回答
0

如果您想读取 SD 卡中的文本文件:

public String readText(Uri fileUri){ String zS,sOut=""; boolean kE10=false; try {
    BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(getContentResolver().openFileDescriptor(fileUri, "r").getFileDescriptor()), StandardCharsets.UTF_8));
    while ((zS = in.readLine()) != null){if (kE10){ sOut+=(char)10+zS; } else {sOut+=zS;} kE10=true;}
} catch (Exception e) {} return sOut;}
于 2021-03-27T06:14:32.317 回答