2012-10-16 44 views
7

chúng tôi đang sử dụng dịch vụ bên ngoài để lấy dữ liệu ở định dạng CSV. chúng tôi đang cố gắng ghi dữ liệu để phản hồi để có thể tải xuống csv cho khách hàng. thật không may, chúng tôi đang nhận dữ liệu ở định dạng dưới đây.Giải mã biểu tượng Bảng mã được mã hóa trong java

Amount inc. VAT  Balance 
£112.83    £0.0 
£97.55    £0.0 
£15.28    £0.0 

chúng tôi không thể giải mã nội dung. Có cách nào để giải mã £ và hiển thị £ trong java không.

Có bất kỳ Chuỗi Utils nào có sẵn để giải mã chuỗi không.

Trả lời

2

Vấn đề: khi chúng ta sử dụng getBytes() trong chuỗi, nó sẽ cố gắng để giải mã bằng cách sử dụng mã hóa mặc định. khi chuỗi được mã hóa, giải mã có thể không hoạt động tốt nếu chúng tôi sử dụng bộ giải mã mặc định.

Giải pháp: Một ChuỗiSau apache sẽ giúp chúng tôi giải mã các ký tự này khi viết thư trả lời. Lớp học này có sẵn trong gói org.apache.commons.codec.binary.

String CSVContent = "/* CSV data */"; 
/** 
* Decode the bytes using UTF8. 
*/ 
String decodedStr = StringUtils.newStringUtf8(CSVContent.getBytes("UTF-8")); 
/** 
* Convert the decoded string to Byte array to write to the stream 
*/ 
Byte [] content = StringUtils.getBytesIso8859_1(decodedStr); 

Phụ thuộc Maven 2.0.

<dependency> 
    <groupId>commons-codec</groupId> 
    <artifactId>commons-codec</artifactId> 
    <version>1.6</version> 
</dependency> 

Giải pháp: Hai

Theo @Joni, giải pháp tốt hơn với các API chuẩn:

content = CSVContent.getBytes("ISO-8859-1"); 
+0

Tương tự, ngắn hơn, với API chuẩn: 'content = CSVContent.getBytes (" ISO-8859-1 ");' – Joni

+0

@Joni Đây thực sự là giải pháp tốt nhất cho vấn đề của tôi. Cảm ơn. –

5

Tệp có vẻ được mã hóa bằng UTF-8. Bạn nên đọc nó như là UTF-8.

Nếu bạn đang sử dụng java.io.FileReader và công ty, bạn nên mở một FileInputStream và sử dụng một InputStreamReader thay vì:

// Before: Reader in = new FileReader(file) 
Reader in = new InputStreamReader(new FileInputStream(file), "UTF-8"); 

Nếu bạn đang sử dụng một số phương pháp khác để đọc các tập tin (một lớp thư viện bên ngoài hoặc bên trong có lẽ?), kiểm tra tài liệu của nó nếu nó cho phép xác định mã hóa văn bản được sử dụng để đọc tệp.

Cập nhật: Nếu bạn đã có một chuỗi các mojibake như £97.55 và không thể sửa chữa cách thức mà nó được đọc, một cách để thu âm là bằng cách chuyển đổi chuỗi lại thành byte và tái diễn giải các byte như UTF-8. Quá trình này không yêu cầu bất kỳ thư viện "StringUtils" hoặc codec bên ngoài nào; API tiêu chuẩn Java đủ mạnh:

String input = ...obtain from somewhere...; 
String output = new String(input.getBytes(/*use platform default*/), "UTF-8"); 
+0

tôi đã cố gắng để đọc các tập tin từ máy tính cục bộ, nó làm việc tốt. Nhưng từ ứng dụng nó không giải mã đúng cách. –

+0

@AnilKumarC Bạn ngụ ý ứng dụng nào? Có lẽ mã hóa của đầu vào cho ứng dụng này bị hỏng. –

+0

@AnilKumarC Nếu bạn không chỉ định mã hóa ký tự khi đọc một tệp, * mã hóa mặc định * được sử dụng. Mã hóa mặc định phụ thuộc vào máy nơi bạn chạy chương trình, vì vậy bạn có thể thấy các kết quả khác nhau trên các hệ thống khác nhau. – Joni

1

Chúng tôi may mắn có Java 7 ngay bây giờ. Bạn có thể làm như sau với Paths, Files, và StandardCharsets:

Path path = Paths.get("/tmp", "input.txt"); 
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8); 
for (String line : lines) { 
    System.out.println(line); 
} 
Các vấn đề liên quan