2013-05-03 36 views
8

Tôi khá mới, vì vậy đừng quá khắc nghiệt :)Tại sao chuỗi Unicode của tôi bị hỏng, khi được chuyển từ Java Applet sang Java Script?

Câu hỏi (tl; dr)

Tôi đang phải đối mặt với một vấn đề qua một unicode String từ một nhúng javax.swing.JApplet trong một trang web để phần Java Script. Tôi không chắc chắn này là liệu một lỗi hoặc một sự hiểu lầm của các công nghệ liên quan:

Vấn đề

Tôi muốn vượt qua một chuỗi unicode từ một Applet Java để Java Script, nhưng String được điều sai lầm. Kỳ lạ thay, vấn đề không xảy ra không phải trong Internet Explorer 10 nhưng trong Chrome (v26)Firefox (v20). Tôi chưa thử nghiệm các trình duyệt khác.

Chuỗi được trả về có vẻ không sao, ngoại trừ ký tự unicode cuối cùng. Kết quả trong Java Script Debugger và trang Web sẽ là:

  • abc → abc
  • 表示 → 表
  • ま → ま
  • ウ ォ ッ チ リ ス ト → ウ ォ ッ チ リ ス
  • ア ッ プ ロ ー ド→ ア ッ プ ロ ー
  • ホ →
  • ホ → ホ (Không xác định)
  • ア ッ プ ロ ー ド abc → ア ッ プ ロ ー ド abc

Chuỗi dường như bị hỏng ở byte cuối cùng. Nếu nó kết thúc bằng một ký tự ASCII thì chuỗi được chấp nhận. Ngoài ra vấn đề không xảy ra trong mọi kết hợp và cũng không phải mọi lần (không chắc chắn về điều này). Vì vậy, tôi nghi ngờ một lỗi và tôi sợ tôi có thể đăng một câu hỏi không hợp lệ.

thử nghiệm Set Up

Một tập Minimalistic lên bao gồm một applet mà trả về một số unicode (UTF-8) dây:

/* TestApplet.java */ 
import javax.swing.*; 

public class TestApplet extends JApplet { 

private String[] testStrings = { 
      "abc", // OK (because ASCII only) 
      "表示", // Error on last Character 
      "表示", // Error on last Character 
      "ホーム ", // OK (because of *space* after ム) 
      "アップロード", ... }; 
    public TestApplet() {...};  // Applet specific stuff 

    ... 

    public int getLength() { return testStrings.length;}; 

    String getTestString(int i) { 
     return testStrings[i]; // Build-in array functionality because of IE. 
    } 
} 

Các trang web tương ứng với kịch bản java có thể trông như thế này:

/* test.html */ 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    </head> 
    <body> 
     <span id="output"/> 
     <applet id='output' archive='test.jar' code=testApplet/> 
    </body> 

    <script type="text/javascript" charset="utf-8"> 
     var applet = document.getElementById('output'); 
     var node = document.getElementById("1"); 
     for(var i = 0; i < applet.getLength(); i++) { 
      var text = applet.getTestString(i); 
     var paragraphNode = document.createElement("p"); 
     paragraphNode.innerHTML = text; 
     node.appendChild(paragraphNode); 
     } 
    </script> 
</html> 

Môi trường

Tôi đang làm việc trên Windows 7 32-Bit với phiên bản Java 1.7.0_21 hiện tại bằng cách sử dụng "Trình cắm Java thế hệ tiếp theo 10.21.2 cho trình duyệt Mozilla". Tôi đã gặp một số vấn đề với ngôn ngữ hệ điều hành của mình, nhưng tôi đã thử một số cài đặt khu vực (tiếng Anh, tiếng Nhật, tiếng Trung).

Trong trường hợp chuỗi Chrome bị hỏng hiển thị các ký tự không hợp lệ (ví dụ: ). Firefox, mặt khác, giảm chuỗi hoàn toàn, nếu nó sẽ kết thúc bằng .

Trình khám phá Internet quản lý để hiển thị các chuỗi chính xác.

Giải pháp?

Tôi có thể tưởng tượng một số cách giải quyết, bao gồm thoát/không thoát và thêm "char cuối cùng" mà sau đó được xóa qua tập lệnh java. Trên thực tế tôi đang lập kế hoạch để viết chống lại Webkit của Android, và tôi đã không thử nghiệm nó ở đó.

Vì tôi muốn tiếp tục thử nghiệm trong Chrome, (vì công nghệ Webkit và sự thoải mái) Tôi hy vọng có một giải pháp nhỏ cho vấn đề mà tôi có thể đã bỏ qua.

+2

Tôi quan tâm đến vấn đề thực sự là gì. Một ý tưởng tôi tìm thấy là: đảm bảo 'javac' và/hoặc' jar' sử dụng mã hóa UTF8 - nếu bạn không chỉ định, nó sử dụng mặc định máy (có thể * là vấn đề) – Ian

+1

Cảm ơn! Tôi sẽ thử điều này sau. Tôi muốn chỉ ra rằng luồng dữ liệu từ tập lệnh java đến applet (tham số gọi) hoạt động như mong đợi. Chỉ có sự trở lại bị rối tung lên. – Inuniku

+1

Tuyệt đối. Bạn đã cho thấy/giải thích rằng tất cả đều hoạt động tốt, ngoại trừ chuỗi được trả về trong các trường hợp đặc biệt (ký tự cuối cùng trong chuỗi trả về có ký tự unicode). Tôi nghĩ rằng bạn đã giải thích tình hình rất tốt và đặt ra mọi thứ một cách rất có tổ chức :) – Ian

Trả lời

1

Nếu bạn đang thử nghiệm trong Chrome/Firefox

Hãy thay thế dòng đầu tiên với điều này và sau đó kiểm tra nó,

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 

Các DOCTYPE có giá trị đáng kể trong khi trình duyệt xác định trang.

Chuyển tiếp/xóa các loại bạn có thể sử dụng với Unicode. Hãy kiểm tra và trả lời ..

+0

Cảm ơn bạn đã nhập! Tôi đã thử điều này, nhưng vẫn không có may mắn. – Inuniku

+0

Bạn có thể đăng html của trang sau khi tạo trang/liên kết của trang (nếu đang phát), điều đó sẽ giúp thêm. – MarmiK

1

Tôi đề nghị để thiết lập một breakpoint trên

paragraphNode.innerHTML = text; 

và kiểm tra văn bản nó trong JavaScript console, ví dụ với

console.log(escape(text)); 

hoặc

console.log(encodeURIComponent(text)); 

hoặc

for (i=0; i < text.length; i++) { 
    console.log("i = "+i); 
    console.log("text.charAt(i) = "+text.charAt(i) 
    +", text.charCodeAt(i) = "+text.charCodeAt(i)); 
} 

cũng Xem

http://www.fileformat.info/info/unicode/char/30a6/index.htm

https://developer.mozilla.org/en-US/docs/DOM/window.escape (mà không phải là một phần của bất kỳ stan Sở NN & PTNT)

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent

hoặc tài nguyên tương tự.

Tệp nguồn của bạn có thể không nằm trong mã hóa mà bạn giả định (UTF-8).

Javascript giả UTF-16 strings:

http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.16

Java cũng giả định UTF-16:

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html

Lệnh Linux hoặc Cygwin file thể chỉ cho bạn mã hóa các tập tin của bạn .

Xem

http://linux.die.net/man/1/file (đã không tìm thấy một tài liệu tham khảo man kernel.org)

+0

Cảm ơn bạn rất nhiều vì câu trả lời phức tạp của bạn! Với hàm 'encodeURI', tôi có thể xuất ra các byte" hỏng "cuối cùng trong chrome: Chúng dường như kết thúc bằng'% EF% BF% BD% EF% BF% BD% 00'. Không chắc chắn nếu đó là đặc tính thực sự, bởi vì firefox không hiển thị một chuỗi bị hỏng ở tất cả (trả về một chuỗi có độ dài là 0 trong trường hợp này). Trên thực tế tôi đã có thể giải quyết vấn đề cho hệ điều hành của tôi (xem câu trả lời khó chịu của tôi). Nhưng nó vẫn ảnh hưởng đến miền địa phương khác ... Có lẽ câu hỏi vẫn còn hợp lệ với sửa đổi. – Inuniku

0

Được rồi, tôi là một chút xấu hổ, bởi vì tôi nghĩ rằng tôi đã thử nó đủ: Tôi đã thực sự sử dụng phi latin locale (e.g Trung Quốc (PRC) hoặc Nhật Bản (Nhật Bản) trong hệ thống cửa sổ locale settings. Khi tôi đổi lại thành Tiếng Anh (Hoa Kỳ) hoặc Đức (Đức) mọi thứ hoạt động như bị xem thường.

Tôi vẫn tự hỏi, tại sao nó sẽ ảnh hưởng đến Chrome & Mozilla theo cách kỳ lạ như vậy, bởi vì Java và các trình duyệt hiện đại nên dựa trên unicode; Vì vậy, tôi sẽ không chấp nhận điều này như một câu trả lời! Vấn đề tái diễn bằng cách chuyển đổi sang tiếng Nhật và tôi sẽ kiểm tra nó trên các hệ thống khác nhau.

Tôi muốn cảm ơn tất cả các áp phích cho đầu vào khai sáng ... và tôi vẫn sẽ nỗ lực giải quyết câu hỏi này.

1

Bạn cần phải chắc chắn để thêm Argument Java sau để Applet/thẻ địa chỉ mạng của bạn:

-Dfile.encoding = utf-8

tức java_arguments = "- Dfile.encoding = utf-8 "

Nếu không, nó sẽ trông đợi và xử lý applet dưới dạng văn bản ASCII.