2010-06-29 24 views
5

Tôi đang tạo ứng dụng gwt lưu trữ văn bản của các trang web ngẫu nhiên trong trường văn bản kho dữ liệu. Thường thì văn bản được định dạng UTF-8. Tất cả các tệp của ứng dụng của tôi được lưu trữ dưới dạng UTF-8 và khi tôi chạy ứng dụng trên máy cục bộ của mình, toàn bộ quá trình hoạt động tốt. Văn bản UTF-8 được lưu trữ như vậy và có thể truy xuất được phiên bản cục bộ của công cụ ứng dụng dưới dạng UTF-8. Tuy nhiên khi tôi triển khai ứng dụng cho công cụ ứng dụng google ở ​​đâu đó giữa khi tôi lưu trữ văn bản và khi tôi truy xuất văn bản, nó không còn là UTF-8 khiến các ký tự không phải ascii được hiển thị như thế nào?Google App Engine DataStore Text Sự cố mã hóa UTF-8

Khi tôi xem kho dữ liệu trong bảng điều khiển appengine, tất cả các ký tự đặc biệt sẽ xuất hiện? dẫn tôi tin rằng đó là vấn đề khi viết vào cơ sở dữ liệu.

Có ai biết cách sửa lỗi này không?

Bản thân ứng dụng hơi lớn. Đây là một số mã giả:

Text webPageText = new Text(<STRING THAT CONTAINS UNICODE CHARACTERS>); 

/*Some Code to store Text object on datastore 
Specifically I'm using javax.jdo.PersistenceManager to do this. 
Some Code to retrieve text from datastore. */ 

String retrievedText = webPageText.getValue(); 

Vấn đề là retrievedText quay lại? thay vì các ký tự unicode.

Đây là vấn đề tương tự trong python mà tôi đã tìm thấy: Trying to store Utf-8 data in datastore getting UnicodeEncodeError. Mặc dù ứng dụng của tôi không nhận được bất kỳ lỗi nào.

Thật không may tôi nghĩ chuỗi Java là mặc định utf-8 và tôi không thể tìm thấy bất kỳ mã nào cho phép tôi khai báo rõ ràng là utf-8.

Chỉnh sửa: Tôi hiện đã tạo một ứng dụng web nhỏ có văn bản unicode và lưu trữ nó trong kho dữ liệu và sau đó truy xuất nó mà không gặp vấn đề gì. Tôi vẫn không có ý tưởng nơi mà vấn đề là trong mã nguồn ban đầu của tôi nhưng tôi sẽ thay đổi cách mã của tôi xử lý truy xuất trang web để phù hợp với các ứng dụng nhỏ hơn mà tôi vừa xây dựng. cám ơn sự giúp đỡ từ mọi người.

+0

Bạn có thể đăng các bit liên quan của mã không? –

+0

Bạn nói rằng bạn nghĩ rằng vấn đề là với lưu trữ và truy xuất, sau đó không bao gồm mã bạn đang sử dụng để lưu trữ và truy xuất dữ liệu! Chúng tôi cần mã có liên quan nếu chúng tôi trợ giúp. –

+0

Nguồn cho toàn bộ dự án hiện được đăng ở trên. Trong một vài giờ, tôi sẽ cố gắng tạo ra một phiên bản nhỏ tái tạo vấn đề. –

Trả lời

0
+0

Tôi không biết python rất tốt nhưng tôi không nghĩ rằng đó là những gì tôi đang tìm kiếm. Tôi chỉ phục vụ 1 trang web cũng là UTF-8 và tôi có thể gửi văn bản UTF-8 giữa máy khách và máy chủ. Vấn đề duy nhất chỉ xảy ra khi văn bản UTF-8 được lưu trữ/lấy ra từ kho dữ liệu appengine. –

+0

Tuyên bố của tôi ở trên có thể không chính xác. Tôi không chắc chắn rằng tôi có thể gửi văn bản UTF-8 giữa máy khách và máy chủ appengine. Sẽ kiểm tra điều này vào ngày mai. –

1

tôi đã cố gắng để chuyển đổi String để ByteArray và sau đó lưu nó như kho dữ liệu blob.

//Save String as Blob 
Blob webPageText = new Blob(<STRING THAT CONTAINS UNICODE CHARACTERS>.getBytes()); 

//Retrieve Blob as String 
String retrievedText = new String(webPageText.getBytes()); 

Tôi nghĩ rằng điều này đã giải quyết được vấn đề nhưng tôi đã nhầm lẫn chỉ kiểm tra trên máy chủ cục bộ của tôi. Mã này vẫn trả về? thay vì các ký tự unicode khiến tôi tin rằng vấn đề không nằm trong kho dữ liệu nhưng trong quá trình chuyển từ công cụ ứng dụng đến máy khách.

+0

Đây có phải là _answer_ thực tế cho câu hỏi của bạn không? Nếu có, hãy chấp nhận nó. –

+0

Điều này vẫn còn ám ảnh tôi. Bạn đã giải quyết chính xác như thế nào? –

3

Đã khắc phục sự cố tương tự bằng cách đặt cả mã hóa yêu cầu và mã hóa phản hồi thành utf-8. Yêu cầu kết quả mã hóa trong chuỗi hợp lệ được lưu trữ trong kho dữ liệu, không có giá trị nào được lưu trữ dưới dạng "???? ..."

yêu cầu: nếu bạn sử dụng Apache HTTP Client, điều này được thực hiện theo cách sau:

Nhận yêu cầu:

NameValuePair... params; 
... 
String url = urlBase + URLEncodedUtils.format(Arrays.asList(params), "UTF-8"); 
HttpGet httpGet = new HttpGet(url); 

bài yêu cầu:

NameValuePair... params; 
... 
HttpPost httpPost = new HttpPost(url); 
httpPost.setEntity(new UrlEncodedFormEntity(Arrays.asList(params), "UTF-8")); 

đáp ứng: nếu bạn xây dựng phản hồi của bạn trong HttpServlet, việc này được thực hiện theo cách sau:

HttpServletResponse resp; 
... 
resp.setContentType("text/html; charset=utf-8"); 
1

Giải pháp mã hóa: Nguyên nhân Sử dụng trình duyệt "8859_1" bộ ký tự
=> Trước
Lưu kho dữ liệu, tôi chuyển đổi bộ ký tự.

new String(req.getParameter("title").getBytes("8859_1"),"utf-8") 

Khi tôi chạy ứng dụng này trên máy cục bộ của tôi, nó ổn. Nhưng khi tôi triển khai, tôi phải đối mặt với cùng một vấn đề mà bạn đã thấy. Tôi đã giải quyết vấn đề này bằng cách:

Sau
=> Lưu mã lưu trữ.

new String(req.getParameter("title").getBytes("utf-8"),"utf-8") 
Các vấn đề liên quan