“用于编码 UTF-8 的不可映射字符”错误

2022-08-31 13:21:17

我在以下方法中遇到编译错误。

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' " '

我该如何解决这个问题?谢谢。


答案 1

您的源代码文件存在编码问题。它可能是ISO-8859-1编码的,但编译器设置为使用UTF-8。这将在使用字符时导致错误,这些字符在 UTF-8 和 ISO-8859-1 中将不具有相同的字节表示形式。这将发生在不属于 ASCII 的所有字符上,例如 NOT SIGN¬

您可以使用以下程序模拟此操作。它只是使用您的源代码行并生成一个ISO-8859-1字节数组,并使用UTF-8编码解码此“错误”。您可以看到线路在哪个位置损坏。我在源代码中添加了2个空格以适合位置74以使其适合NOT SIGN,这是唯一的字符,它将在ISO-8859-1编码和UTF-8编码中生成不同的字节。我想这将使缩进与真正的源文件相匹配。¬

 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));     

这会导致以下输出(由于标记而混乱):

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

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

在 https://ideone.com/ShZnB“现场”查看

要解决此问题,请使用 UTF-8 编码保存源文件。


答案 2

我正在为2000年开始的旧系统在Linux盒子上设置CI构建服务器。有一个部分生成包含非 UTF8 字符的 PDF。我们正处于发布的最后阶段,所以我无法取代那些让我悲伤的角色,但是由于Dilbertesque的原因,我不能在发布后等待一周来解决这个问题。幸运的是,Ant 中的 “javac” 命令有一个 “encoding” 参数。

 <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>

推荐