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

新手上路,请多包涵

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

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

在 Utility.java:[76,74] 无法映射的字符
编码 UTF-8。第74个字符是'"'

我怎样才能解决这个问题?谢谢。

原文由 Ravi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.2k
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));

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

String reg = “^(?=. [0-9])(?=. [az])(?=. [AZ])(?=. [~#;:?/@&!”‘%*= �.,-])(?=[^\s]+\().{8,24}\)”;: �

String reg = “^(?=. [0-9])(?=. [az])(?=. [AZ])(?=. [~#;:?/@&!”’%*= ¬.,-])(?=[^\s]+\().{8,24}\)”;: ¬

https://ideone.com/ShZnB 上查看“实时”

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

原文由 Michael Konietzka 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题