关于java:如何防止写特殊字符

How to prevent writing of special character

本问题已经有最佳答案,请猛点这里访问。

我使用Java将一个SQL表导出到TXT中。除了一些字母上的重音符号的减号问题外,其他都可以。特别是我对"_"有问题,因为在我的TXT文件中,它被转换为"?""。我不知道为什么,但是如果我尝试导出包含该字段的表的记录(因此只写一条记录),就没有问题;如果我尝试导出整个表(数千条记录),就会出现这个问题。

我已经尝试过字符串类提供的替换方法,但结果相同。我还尝试使用Unicode中的che转义字符,但仍然存在相同的问题。有什么暗示吗?

编辑以下是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if(array_query.equals(versamenti_tasi)) {
                        File myOutputDir = new File("C:\\comuni\\prova\\009_001_Versamenti");
                        if(!myOutputDir.exists())
                            myOutputDir.mkdir(); //Returns a boolean if you want to check it was successful.
                        PrintStream o = new PrintStream(myOutputDir +"\" + array_query[x].substring(26) +".txt");
                        System.setOut(o);

while (rs.next()) {
    out ="
";
    final_index = 0;
    for(int i =1; i <= rsmd.getColumnCount(); i++) {
        if(rs.getString(i) == null) {
           final_index += rsmd.getColumnDisplaySize(i);
           out +="
" + str_valore;
           out = out.substring(0, final_index);
        }else{
           final_index += rsmd.getColumnDisplaySize(i);
           out += rs.getString(i).trim() + str_valore;
           out = out.substring(0, final_index);

        }

    }
    System.out.println(out);
}

简单地说,写入部分在循环中;str_valore是一个250个字符的空字符串,这是因为我需要取该字段的db原始大小;rs是我的resultset,rsmd是元数据resultset。


我不知道您更改了哪个Eclipse设置,但我怀疑这会影响您的PrintStream(它可能以utf-8读取/显示文件)。

要为您的PrintStream设置编码,请使用适当的构造函数:

更改此行

1
PrintStream o = new PrintStream(myOutputDir +"\" + array_query[x].substring(26) +".txt");

1
2
PrintStream o = new PrintStream(myOutputDir +"\" + array_query[x].substring(26) +".txt",
                   "
UTF-8");

(或为数据库模式配置的任何编码。)