OS.有一个UTF-8编码的文本文件,用FileReader读取到一个字符串,然后转换字符集:str=new String(str.getBytes(),"UTF-8");结果大部分中文显示正常,但最后仍有部分汉字显示为问号!
Java代码
1.public static List<String> getLines(String fileName){
2. List<String> lines=new ArrayList<String>();
3. try {
4. BufferedReader br = new BufferedReader(new FileReader(fileName));
5. String line = null;
6. while ((line = br.readLine()) != null) {
7. lines.add(new String(line.getBytes("GBK"),"UTF-8"));
8. }
9. br.close();
10. } catch (FileNotFoundException e) {
11. }catch (IOException e) {}
12. return lines;
13. }
public static List<String> getLines(String fileName){
List<String> lines=new ArrayList<String>();
try {
BufferedReader br = new BufferedReader(new FileReader(fileName));
String line = null;
while ((line = br.readLine()) != null) {
lines.add(new String(line.getBytes("GBK"),"UTF-8"));
}
br.close();
} catch (FileNotFoundException e) {
}catch (IOException e) {}
return lines;
}
文件读入时是按OS的默认字符集即GBK解码的,我先用默认字符集GBK编码str.getBytes(“GBK”),此时应该还原为文件中的字节序列了,然后再按UTF-8解码,生成的字符串按理说应该就应该是正确的。
为什么结果中还是有部分乱码呢?
问题出在FileReader读取文件的过程中,FileReader继承了InputStreamReader,但并没有实现父类中带字符集参数的构造函数,所以FileReader只能按系统默认的字符集来解码,然后在UTF-8 -> GBK -> UTF-8的过程中编码出现损失,造成结果不能还原最初的字符。
原因明确了,这个问题解决起来并不困难,用InputStreamReader代替FileReader,InputStreamReader isr=new InputStreamReader(new FileInputStream(fileName),"UTF-8");这样读取文件就会直接用UTF-8解码,不用再做编码转换。
Java代码
1.public static List<String> getLines(String fileName){
2. List<String> lines=new ArrayList<String>();
3. try {
4. BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(fileName),"UTF-8"));
5. String line = null;
6. while ((line = br.readLine()) != null) {
7. lines.add(line);
8. }
9. br.close();
10. } catch (FileNotFoundException e) {
11. }catch (IOException e) {}
12. return lines;
13. }
分享到:
相关推荐
要解决Java读取TXT文件中文乱码的问题,关键在于指定正确的编码方式。以下是使用`BufferedReader`和`FileReader`读取UTF-8编码的TXT文件的示例: ```java import java.io.BufferedReader; import java.io....
Java字符编码转换是Java开发中一个重要的...总的来说,理解Java中的字符编码转换过程至关重要,这有助于在处理多语言和跨平台项目时避免数据丢失或乱码问题。开发者应始终关注编码的正确设置,并在必要时进行手动转换。
在Java编程语言中,处理字符串编码是至关重要的,因为正确的编码和...理解并正确使用这些方法可以避免常见的编码问题,如乱码和数据丢失。在开发过程中,始终记住指定正确的编码,特别是在跨平台或处理多语言内容时。
- 当需要读取或写入包含文本内容的文件时,如.txt、.properties等,使用字符流更合适,因为它能处理字符编码,避免了字节流处理文本时可能出现的乱码问题。 - 在读取时,字符流会按字符大小进行读取,不会出现半个...
例如,从UTF-8编码的文件读取内容时,如果误认为是ISO-8859-1编码,那么某些字符将无法正确解析。 8. 国际化与本地化 Java的`java.text`包提供了一系列类支持国际化和本地化,这些类在处理日期、货币、数字以及字符...
不正确的编码设置可能导致乱码或数据丢失。因此,开发者需要对Unicode、ASCII、GBK等常见字符集有所了解,并熟练掌握Java中的相关API,以确保程序在各种环境下的兼容性和正确性。 总之,编码器在编程领域,特别是...
Java中的流是处理数据传输的一种抽象,它将数据视为字节序列进行操作。根据处理的数据单位,Java提供了两种主要类型的流:字符流和字节流。...正确选用流类型可以避免数据丢失、乱码等问题,同时优化性能。