2011-02-14 57 views
57

Tôi đang gặp lỗi biên dịch theo phương pháp sau."Ký tự không thể sửa đổi mã hóa UTF-8" lỗi

public static boolean isValidPasswd(String passwd) { 
    String reg = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~#;:?/@&!\"'%*=¬.,-])(?=[^\\s]+$).{8,24}$"; 
    return Pattern.matches(reg, passwd); 
} 
 
at Utility.java:[76,74] unmappable character for 
enoding UTF-8. 74th character is' " ' 

Làm thế nào tôi có thể sửa lỗi này? Cảm ơn.

+0

Biên dịch tốt với Eclipse của tôi, nhưng '¬' ở giữa có vẻ lạ một chút, bạn có chắc chắn vấn đề là '' 'chứ không phải' ¬ '? Bạn đã thử lưu tệp với một số trình soạn thảo khác và đảm bảo mã hóa là UTF-8? – esaj

+0

những gì tôi đã làm là mở tệp đang đề cập đến (hy vọng bạn có thể suy ra tệp nào mà nó đang phàn nàn). Sau đó, tôi đã lưu lại tệp (sau khi viết một vài ký tự ngẫu nhiên để đăng ký thay đổi , sau đó xóa chúng đi. Sau đó, sau khi lưu lại, tôi có thể biên dịch.Tôi cho rằng việc lưu lại sẽ lưu tệp theo cách gốc của hệ điều hành của bạn. – user798719

Trả lời

1

Các biên dịch sau đây cho tôi:

class E{ 
    String s = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~#;:?/@&!\"'%*=¼.,-])(?=[^\\s]+$).{8,24}$"; 
} 

Xem:

enter image description here

+1

Bạn đã thay thế '¬' bằng' ¼'. –

+0

@Luke mhh đó là lẻ, đó là những gì sao chép/dán cho tôi .. Tôi đã thêm ảnh chụp màn hình của cửa sổ gvim của tôi. Dù sao, tôi không thực sự trả lời câu hỏi, vì vậy tôi sẽ làm CW này. – OscarRyz

6

Trình biên dịch Java giả định rằng đầu vào của bạn là UTF-8 mã hóa, hoặc vì bạn chỉ định nó được hoặc vì đó là mã hóa mặc định nền tảng của bạn.

Tuy nhiên, dữ liệu trong các tệp .java của bạn không thực sự được mã hóa bằng UTF-8. Vấn đề có thể là ký tự ¬. Đảm bảo rằng trình soạn thảo (hoặc IDE) của bạn lựa chọn thực sự bảo mật tệp của nó trong mã hóa UTF-8.

2

Trình biên dịch đang sử dụng mã hóa ký tự UTF-8 để đọc tệp nguồn của bạn. Nhưng tệp phải được viết bởi một trình soạn thảo bằng cách sử dụng một mã hóa khác. Mở tệp của bạn trong trình chỉnh sửa được đặt thành mã hóa UTF-8, sửa dấu ngoặc kép và lưu lại.

Hoặc, bạn có thể tìm điểm Unicode cho ký tự và sử dụng thoát Unicode trong mã nguồn. Ví dụ, ký tự A có thể được thay thế bằng cách thoát Unicode \u0041.

Nhân tiện, bạn không cần phải sử dụng các móc neo đầu và cuối dòng ^$ khi sử dụng phương pháp matches(). Toàn bộ chuỗi phải khớp với cụm từ thông dụng khi sử dụng phương thức matches(). Các neo chỉ hữu ích với phương thức find().

38

Bạn gặp sự cố mã hóa với tệp mã nguồn của bạn. Nó có thể được mã hoá ISO-8859-1, nhưng trình biên dịch được thiết lập để sử dụng UTF-8. Điều này sẽ dẫn đến lỗi khi sử dụng các ký tự, sẽ không có cùng biểu diễn byte trong UTF-8 và ISO-8859-1. Điều này sẽ xảy ra với tất cả các ký tự không thuộc ASCII, ví dụ: ¬NOT SIGN.

Bạn có thể mô phỏng điều này bằng chương trình sau. Nó chỉ sử dụng dòng mã nguồn của bạn và tạo ra một mảng byte ISO-8859-1 và giải mã "sai" này với mã hóa UTF-8. Bạn có thể thấy vị trí mà dòng bị hỏng. Tôi đã thêm 2 dấu cách vào mã nguồn của bạn để vừa với vị trí 74 để vừa với số này là ¬NOT SIGN, ký tự duy nhất, sẽ tạo các byte khác nhau trong mã hóa ISO-8859-1 và mã hóa UTF-8. Tôi đoán điều này sẽ khớp với thụt đầu dòng với tệp nguồn thực.

String reg = "  String reg = \"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~#;:?/@&!\"'%*=¬.,-])(?=[^\\s]+$).{8,24}$\";"; 
String corrupt=new String(reg.getBytes("ISO-8859-1"),"UTF-8"); 
System.out.println(corrupt+": "+corrupt.charAt(74)); 
System.out.println(reg+": "+reg.charAt(74));  

mà kết quả trong đầu ra sau đây (điều sai lầm vì đánh dấu):

String reg = "^(?=.[0-9])(?=.[a-z])(?=.[A-Z])(?=.[~#;:?/@&!"'%*=�.,-])(?=[^\s]+$).{8,24}$";: �

String reg = "^(?=.[0-9])(?=.[a-z])(?=.[A-Z])(?=.[~#;:?/@&!"'%*=¬.,-])(?=[^\s]+$).{8,24}$";: ¬

Xem "sống" tại https://ideone.com/ShZnB

Để sửa lỗi này, lưu các tập tin nguồn với UTF-8 mã hóa.

+2

Cảm ơn Michael! Tôi đã có vấn đề tương tự trong một dự án java kiểm tra từ một máy chủ cvs cũ. Vì vậy, để sửa chữa nó tôi đã làm - [Xác định và thay đổi mã hóa ký tự tệp] (http://mindspill.net/computing/linux-notes/determine-and-change-file-character-encoding/): find -name '* .java '-exec recode Latin-1..UTF-8 {} \; – Gilberto

+3

Câu trả lời sẽ hữu ích với ví dụ về CÁCH để lưu tệp nguồn bằng mã hóa UTF-8. Cảm ơn! – kellyfj

+0

@kellyfj Điều này tùy thuộc vào trình soạn thảo mà người dùng sử dụng. Tôi đoán mọi biên tập viên đều có một số menu cho loại tùy chọn này. –

1

"lỗi: ký tự không thể chuyển đổi để mã hóa UTF-8" có nghĩa là, java đã tìm thấy một ký tự không đại diện trong UTF-8. Do đó, mở tệp trong trình chỉnh sửa và đặt mã hóa ký tự thành UTF-8. Bạn sẽ có thể tìm thấy một ký tự không được biểu diễn bằng UTF-8.Tắt nhân vật này và biên dịch lại.

9

Tôi đang trong quá trình thiết lập máy chủ xây dựng CI trên hộp Linux cho hệ thống cũ bắt đầu vào năm 2000. Có một phần tạo tệp PDF chứa ký tự không phải UTF8. Chúng tôi đang trong các bước cuối cùng của bản phát hành, vì vậy tôi không thể thay thế các nhân vật khiến tôi đau buồn, nhưng vì lý do Dilbertesque, tôi không thể chờ một tuần để giải quyết vấn đề này sau khi phát hành. May mắn thay, lệnh "javac" trong Ant có tham số "mã hóa".

<javac destdir="${classes.dir}" classpathref="production-classpath" debug="on" 
    includeantruntime="false" source="${java.level}" target="${java.level}" 

    encoding="iso-8859-1"> 

    <src path="${production.dir}" /> 
</javac> 
3

Trong nhật thực, hãy thử đến thuộc tính tệp (Alt + Enter) và thay đổi tài nguyên -> 'Mã hóa tệp văn bản' -> sang khác thành UTF-8. Mở lại tệp và kiểm tra sẽ có ký tự rác ở đâu đó trong chuỗi/tệp. Gỡ bỏ nó. Lưu các tập tin.

Thay đổi mã hóa Tài nguyên -> 'Mã hóa tệp văn bản' thành Mặc định.

Biên dịch và triển khai mã.

2

Cảm ơn Michael Konietzka (https://stackoverflow.com/a/4996583/1019307) cho câu trả lời của bạn.

Tôi đã làm điều này trong Eclipse/STS:

Preferences > General > Content Types > Selected "Text" 
    (which contains all types such as CSS, Java Source Files, ...) 
Added "UTF-8" to the default encoding box down the bottom and hit 'Add' 

Bingo, lỗi đi!

3

Đối với người dùng IntelliJ, điều này khá dễ dàng khi bạn tìm hiểu xem mã hóa ban đầu là gì. Bạn có thể chọn mã hóa từ góc dưới bên phải của cửa sổ, bạn sẽ được nhắc nhở với một hộp thoại nói:

The encoding you've chosen ('[encoding type]') may change the contents of '[Your file]'. Do you want to reload the file from disk or convert the text and save in the new encoding?

Vì vậy, nếu bạn tình cờ có một vài ký tự được lưu trong một số mã hóa lẻ, những gì bạn nên làm đầu tiên chọn 'Tải lại' để tải tệp tất cả trong bảng mã của các ký tự không hợp lệ. Đối với tôi điều này đã biến? ký tự vào giá trị thích hợp của chúng.

IntelliJ có thể cho biết bạn có nhiều khả năng không chọn mã hóa phù hợp và sẽ cảnh báo bạn. Hoàn nguyên ngược lại và thử lại.

Khi bạn có thể thấy các ký tự xấu biến mất, hãy thay đổi hộp chọn mã hóa ở góc dưới cùng bên phải về định dạng bạn dự định ban đầu (nếu bạn đang tìm kiếm thông báo lỗi này, có thể là UTF-8). Lần này chọn nút 'Chuyển đổi' trên hộp thoại.

Đối với tôi, tôi cần tải lại dưới dạng 'windows-1252', sau đó chuyển đổi thành 'UTF-8'. Các ký tự vi phạm là dấu nháy đơn (‘và’) có khả năng được dán từ một tài liệu Word (hoặc e-mail) với mã hóa sai, và các hành động trên sẽ chuyển đổi chúng thành UTF-8.

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