5

Tôi đang sử dụng kho dữ liệu GAE cho một ứng dụng Java và lưu trữ một số văn bản sẽ có nhiều ngôn ngữ. Trong servlet của tôi, tôi lần đầu tiên kiểm tra để xem nếu có bất kỳ dữ liệu trong lưu trữ dữ liệu, và nếu không, tôi là tạo ra một số người, tương tự như sau:Mã hóa dữ liệu của Google App Engine?

ArrayList<Lang> list = new ArrayList<Lang>(); 
list.add(new Lang("EN", "English", 1)); 
list.add(new Lang("ES", "Español", 0)); 
//more languages here... 

PersistenceManager pm = PMF.get().getPersistenceManager(); 
for(Lang l : list) { 
    pm.makePersistent(l); 
} 

Vì đây là sử dụng JDO, tôi tôi cũng nên bao gồm các phần có liên quan của lớp học Lang:

@PersistenceCapable 
public class Lang { 
@PrimaryKey 
private String code; 
@Persistent 
private String name; 
@Persistent 
private int popularity; 
// getters & setters & constructors... 
} 

Tuy nhiên, các ký tự không phải ASCII khiến tôi đau buồn. Tôi đã thiết lập dự án Eclipse của tôi để sử dụng mã hóa UTF-8 thay vì Cp1252 mặc định, vì vậy tôi nghĩ rằng Tôi không quan tâm đến quan điểm đó, nhưng khi tôi sử dụng Trình xem dữ liệu của App Engine để xem dữ liệu của tôi, đó là Español mục nhập trở thành Espaà ± ol, và khi tôi nhấp vào nó để xem nó, tôi nhận được một lỗi máy chủ 500. (Có một số mục khác có văn bản từ phải sang trái thậm chí không hiển thị trong Trình xem dữ liệu, nhưng một vấn đề tại một thời điểm ...)

Có điều gì đặc biệt tôi có thể làm trong mã để đặt mã hóa ký tự hoặc chỉ định GAE rằng dữ liệu tôi đang lưu trữ là UTF-8? Hoặc là vấn đề ở phía Eclipse, và có điều gì tôi nên làm với mã Java của tôi không?

+0

Không phải là "giải pháp", nhưng nếu tôi chèn dữ liệu theo cách thủ công, sử dụng Trình xem dữ liệu, nó được chèn vào và servlet của tôi lấy dữ liệu từ kho dữ liệu và trả về nó cũng trả về dữ liệu. Điều này có thể trở thành giải pháp của tôi; Tôi chỉ cần tải ban đầu của dữ liệu được thực hiện, và sau đó nó sẽ không được cập nhật, do đó, làm nó theo cách thủ công là một lựa chọn. Mặc dù tôi muốn biết tại sao giải pháp mã hóa không hoạt động ... – sernaferna

Trả lời

0

Bạn có chắc chắn có vấn đề với dữ liệu của mình không? Tôi cũng gặp phải các vấn đề tương tự trước đây nhưng hóa ra đó là một vấn đề trong phiên bản Python của Trình xem dữ liệu. Tôi có thể lấy lại dữ liệu của tôi trong Java.

+0

Vâng, tôi chắc chắn đó là vấn đề với dữ liệu. Khi tôi nhập dữ liệu thông qua Trình xem dữ liệu theo cách thủ công, tôi thấy cột dữ liệu và ứng dụng của tôi cũng có thể lấy lại dữ liệu một cách chính xác thông qua JSON.Nhưng khi tôi tạo dữ liệu thông qua mã Java, nó bằng cách nào đó bị cắt xén trên đường đến cơ sở dữ liệu. – sernaferna

+0

Có thể chuỗi của bạn đã bị rối tung trong Java rồi. Giả sử trình chỉnh sửa của bạn là UTF-8 nhưng máy chủ của bạn bằng tiếng Latin-1. Bạn sẽ nhận được văn bản bị cắt xén đó. –

1

Cố định vấn đề tương tự bằng cách thiết lập cả mã hóa yêu cầu và phản hồi cho utf-8. kết quả yêu cầu mã hóa trong chuỗi giá trị được lưu trữ trong kho dữ liệu, mà không có nó giá trị sẽ được lưu trữ như là "???? ..."

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:

yêu cầu

Nhận:

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 trả lời của bạn trong HttpServlet, điều này được thực hiện theo cách sau:

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

tôi lưu ý rằng bạn đã thiết lập dự án Eclipse của mình để sử dụng mã hóa văn bản UTF-8. Bạn đã kiểm tra lại văn bản chứa đựng tệp Java chứa chuỗi như "Español" chưa?

Các vấn đề liên quan