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

Rav*_*avi 64 java encoding maven-2 utf-8

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

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

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

Mic*_*zka 45

您的源代码文件存在编码问题.它可能是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));     
Run Code Online (Sandbox Code Playgroud)

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

String reg ="^(?=.[0-9])(?=. [az])(?=.[AZ])(?=. [〜#;:?/ @&!"'%*= ., - ])(?= [^\s] + $).{8,24} $";:

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

请访问https://ideone.com/ShZnB,查看"直播"

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

  • 答案对于如何使用UTF-8编码保存源文件的示例很有帮助.谢谢! (6认同)
  • 谢谢迈克尔!我从旧的cvs服务器检出的java项目中有类似的问题.所以,为了解决这个问题,我做了 - [确定并更改文件字符编码](http://mindspill.net/computing/linux-notes/determine-and-change-file-character-encoding/):find -name'*.java'-exec recode Latin-1..UTF-8 {} \; (2认同)

Ste*_*man 13

我正在Linux机器上为2000年开始的遗留系统设置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>
Run Code Online (Sandbox Code Playgroud)


Joa*_*uer 6

Java编译器假定您的输入是UTF-8编码,因为您指定它是因为它是您的平台默认编码.

但是,.java文件中的数据实际上并未以UTF-8编码.问题可能就是¬角色.确保您选择的编辑器(或IDE)实际上以UTF-8编码保护其文件.


小智 5

在 Eclipse 中尝试转到文件属性 ( Alt+ Enter) 并将Resource→ ' Text File encoding' →更改OtherUTF-8. 重新打开文件并检查字符串/文件中某处是否有垃圾字符。去掉它。保存文件。

将编码资源 → ' Text File encoding' 改回默认值。

编译和部署代码。


cwa*_*ash 5

对于 IntelliJ 用户来说,一旦你知道原始编码是什么,这就非常容易了。您可以从窗口右下角选择编码,系统将提示您一个对话框:

\n\n
\n

您选择的编码(“[编码类型]”)可能会更改“[您的文件]”的\n内容。您想从磁盘重新加载文件还是转换文本并以新编码保存?

\n
\n\n

因此,如果您碰巧以某种奇怪的编码保存了一些字符,您应该首先选择“重新加载”以全部以错误字符的编码加载文件。对我来说这变成了?字符转换为适当的值。

\n\n

IntelliJ 可以判断您是否很可能没有选择正确的编码,并会向您发出警告。恢复并重试。

\n\n

一旦您看到坏字符消失,请将右下角的编码选择框更改回您最初想要的格式(如果您在 Google 上搜索此错误消息,则可能是 UTF-8)。这次选择对话框上的“转换”按钮。

\n\n

对我来说,我需要重新加载为“windows-1252”,然后转换回“UTF-8”。有问题的字符是单引号(\xe2\x80\x98 和 \xe2\x80\x99),可能是从 Word 文档(或电子邮件)中使用错误的编码粘贴的,上述操作会将它们转换为 UTF-8 。

\n


Osc*_*Ryz 1

以下内容为我编译:

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

看:

\n\n

在此输入图像描述

\n