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) và 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.
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
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
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