2

我正在尝试读取一个 UTF-8 编码的 txt 文件,其中包含一些土耳其字符。基本上我已经编写了一个基于轴的 Web 服务,它读取这个文件并将输出作为字符串发送回来。不知何故,我无法正确阅读字符。代码非常简单,如此处所述:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CodingErrorAction;

public class TurkishWebService {

    public String generateTurkishString() throws IOException {
        InputStream isr = this.getClass().getResourceAsStream(
                "/" + "turkish.txt");

        BufferedReader in = new BufferedReader(new InputStreamReader(isr,
                "UTF8"));
        String str;

        while ((str = in.readLine()) != null) {
            System.out.println(str);
        }

        in.close();
        return str;
    }

    public String normalString() {
        System.out.println("webService normal text");
        return "webService normal text";
    }

    public static void main(String args[]) throws IOException {
        new TurkishWebService().generateTurkishString();
    }
}

这里是turkish.txt的内容,只有一行

Assalğçğıİİööşş

我得到标准输出

Assal?τ????÷÷??

请建议我在这里做错了什么。

4

3 回答 3

5

确保用于显示输出的控制台也以 UTF-8 编码。例如,在 Eclipse 中,您需要转到Run Configuration>Common来执行此操作。

在此处输入图像描述

于 2013-05-08T08:11:51.490 回答
2

您似乎正确地将文件数据从 UTF-8 解码为 UTF-16 字符串。

System.out执行从 UTF-16 字符串到默认 JRE 字符编码的转码操作。如果这与接收字符数据的设备使用的编码不匹配,则会损坏。因此,控制台应设置为默认字符编码,否则会发生数据损坏。这是如何完成的取决于设备。

如果您使用的是终端,则控制台可以更好地确定设备编码。

注意:最好使用try-with-resources或至少try-finally来关闭流;如果可用,请使用标准编码常量。

于 2013-05-08T08:42:10.220 回答
0

代码看起来不错。问题应该出在无法打印土耳其语的控制台输出中。确保在您的程序中进行临时测试:使用 Assal?τ????÷÷?? 您从文件中读取并执行此操作

 System.out.println(str.charAt(6) == 'ğ');
于 2013-05-08T08:10:02.183 回答