为什么Java的的BufferedReader()不能正确读取阿拉伯文和中国字?
题
我想读一下包含在每一行,并包含英语和中国文字,每行的另一个文件英语和阿拉伯语字符的文件。然而,阿拉伯和中国的字符无法正确显示 - 他们只是显示为问号。任何想法,我怎么能解决这个问题?
下面是我使用用于读取的代码:
try {
String sCurrentLine;
BufferedReader br = new BufferedReader(new FileReader(directionOfTargetFile));
int counter = 0;
while ((sCurrentLine = br.readLine()) != null) {
String lineFixedHolder = converter.fixParsedParagraph(sCurrentLine);
System.out.println("The line number "+ counter
+ " contain : " + sCurrentLine);
counter++;
}
}
<强>版01 强>
读线路并获得阿拉伯和中国的字后,我用一个函数通过简单地寻找到他们翻译的鉴于阿拉伯文字的在一个ArrayList(包含所有预期的话)(使用的indexOf() ; 方法)。然后,当这个词的索引中找到它用来调用它在另一个ArrayList中的相同指数的英文单词。然而,因为它搜索问号,而不是阿拉伯和中国的字符时失败,该搜索始终返回false。所以,我的System.out.println打印显示我空值,每一个失败的翻译。
*我使用NetBeans 6.8的Mac版IDE
<强>版02 强>
下面是搜索翻译的代码:
int testColor = dbColorArb.indexOf(wordToTranslate);
int testBrand = -1;
if ( testColor != -1 ) {
String result = (String)dbColorEng.get(testColor);
return result;
} else {
testBrand = dbBrandArb.indexOf(wordToTranslate);
}
//System.out.println ("The testBrand is : " + testBrand);
if ( testBrand != -1 ) {
String result = (String)dbBrandEng.get(testBrand);
return result;
} else {
//System.out.println ("The first null");
return null;
}
实际上,我寻找2周的ArrayList其中可能包含所需的单词翻译。如果没有找到他们两个的ArrayList,则返回null。
<强>版03 强>
当我调试我发现线上读出被存储在我的字符串变量,如下所示:
"3;0000000000;0000001001;1996-06-22;;2010-01-27;����;;01989;������;"
<强>版03 强>
我读的文件已经给我它已经被另一个程序(我什么都不知道旁边这是一个在VB制造)的计划提出,显示不正确出现在阿拉伯字母修改后。当我检查记事本文件的编码++这表明它的ANSI。然而,当我将它转换为UTF-8(它取代了阿拉伯字母与其他英语一个),然后将其转换回ANSI阿拉伯语成为问号!
解决方案
用来读取字符文件的便捷类。这个类的构造函数假设默认的字符编码和默认字节缓冲区大小是适当的。要自己指定这些值,在构建一个FileInputStream的InputStreamReader。
所以:
Reader reader = new InputStreamReader(new FileInputStream(fileName), "utf-8");
BufferedReader br = new BufferedReader(reader);
如果这仍然不起作用,那么也许您的控制台未设置为正确显示UTF-8字符。配置取决于所使用的IDE和相当简单。
<强>更新强>在上面的代码替换utf-8
与cp1256
。这工作对我很好(操作系统,JDK6)
不过,我建议你坚持使用UTF-8所生成的文件。因为cp1256
不会为中国工作,你会再有类似的问题。
其他提示
它最有可能在读取正确的信息,但是你的输出流可能不是UTF-8,因此无法在您的输出字符集显示任何字符正在与替换“?”。
可以通过获取出的每个字符和印刷字符序证实这一点。
public void writeTiFile(String fileName,String str){
try {
FileOutputStream out = new FileOutputStream(fileName);
out.write(str.getBytes("windows-1256"));
} catch (Exception ex) {
ex.printStackTrace();
}
}