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

时间:2011-02-14 17:15:44

标签: java maven-2 encoding utf-8

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

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

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

10 个答案:

答案 0 :(得分:44)

您的源代码文件存在编码问题。它可能是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编码保存源文件。

答案 1 :(得分:12)

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

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:3)

在eclipse中尝试转到文件属性(Alt + Enter)并更改资源 - &gt; '文本文件编码' - &gt;到UTF-8的其他。重新打开文件,检查字符串/文件中的某个地方是否有垃圾字符。去掉它。保存文件。

更改编码资源 - &gt; “文本文件编码”返回默认值。

编译并部署代码。

答案 4 :(得分:3)

感谢Michael Konietzka(https://stackoverflow.com/a/4996583/1019307)的回答。

我是在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'
宾果,错误消失了!

答案 5 :(得分:3)

对于IntelliJ用户,一旦找到原始编码,这很容易。您可以从窗口右下角选择编码,系统将提示您输入一个对话框:

  

您选择的编码(&#39; [编码类型]&#39;)可能会更改内容   &#39; [你的档案]&#39;。是否要从磁盘重新加载文件或转换   文本并以新编码保存?

因此,如果您碰巧在一些奇怪的编码中保存了一些字符,那么您应该首先选择“重新加载”#39;加载文件全部在坏字符的编码。对我来说,这转变了?将人物塑造成适当的价值。

IntelliJ可以判断您是否很可能没有选择正确的编码并会警告您。退回并重试。

一旦您看到不良字符消失,请将右下角的编码选择框更改回您最初预期的格式(如果您使用Google搜索此错误消息,则可能是UTF-8)。这次选择&#39;转换&#39;对话框上的按钮。

对我来说,我需要重新加载为&#39; windows-1252&#39;,然后转换回&#39; UTF-8&#39;。违规字符是单引号('和'),可能是使用错误的编码从Word doc(或电子邮件)粘贴的,上述操作会将它们转换为UTF-8。

答案 6 :(得分:2)

编译器使用UTF-8字符编码来读取源文件。但该文件必须由编辑器使用不同的编码编写。在设置为UTF-8编码的编辑器中打开文件,修复引号,然后重新保存。

或者,您可以找到该字符的Unicode点,并在源代码中使用Unicode转义符。例如,可以使用Unicode转义A替换字符\u0041

顺便说一句,使用^方法时,您不需要使用开始和结束行锚点$matches()。使用matches()方法时,整个序列必须与正则表达式匹配。锚点仅适用于find()方法。

答案 7 :(得分:1)

以下编译:

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

见:

enter image description here

答案 8 :(得分:1)

“错误:编码UTF-8的不可映射字符”意味着,java找到了一个不以UTF-8表示的字符。因此,在编辑器中打开文件并将字符编码设置为UTF-8。你应该能够找到一个没有用UTF-8表示的字符。取消这个字符并重新编译。

答案 9 :(得分:-1)

我在使用Eclipse时观察到了这个问题。我需要在我的pom.xml文件中添加编码并解决。 http://ctrlaltsolve.blogspot.in/2015/11/encoding-properties-in-maven.html