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

我在下面的方法得到一个编译错误。

public static boolean isValidPasswd(String passwd) { String reg = "^(?=.*[0-9])(?=.*[az])(?=.*[AZ])(?=.*[~#;:?/@&!\"'%*=¬.,-])(?=[^\\s]+$).{8,24}$"; return Pattern.matches(reg, passwd); } 
在Utility.java:[76,74]不可映射的字符 
编码UTF-8。 第74个字符是'''

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

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

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

  String reg = " String reg = \"^(?=.*[0-9])(?=.*[az])(?=.*[AZ])(?=.*[~#;:?/@&!\"'%*=¬.,-])(?=[^\\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上的; “live”

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

我正在为在2000年启动的旧版系统在Linux机器上设置CI构build服务器。有一个部分可生成包含非UTF8字符的PDF。 我们正处于发行的最后阶段,所以我不能replace让我悲伤的angular色,但是对于狄尔伯斯特的原因,我不能等待一个星期才能解决这个问题。 幸运的是,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> 

Java编译器假定您的input是UTF-8编码,或者是因为您指定了input,或者是因为它是您的平台默认编码。

但是, .java文件中的数据实际上并未以UTF-8编码。 问题可能是性格。 确保你select的编辑器(或者IDE)实际上是以UTF-8编码保护它的文件的。

在日食尝试去文件属性(Alt + Enter),并更改资源 – >“文本文件编码” – >其他UTF-8。 重新打开文件并检查string/文件中是否有垃圾字符。 去掉它。 保存文件。

将编码资源 – >“文本文件编码”更改回默认值。

编译并部署代码。

编译器正在使用UTF-8字符编码来读取您的源文件。 但是该文件必须是由编辑器使用不同的编码编写的。 在设置为UTF-8编码的编辑器中打开文件,修改引号,并再次保存。

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

顺便说一下,在使用matches()方法时,您不需要使用开始和结束线锚点^$ 。 使用matches()方法时,整个序列必须与正则expression式matches() 。 锚只用于find()方法。

对于IntelliJ用户,一旦找出原始编码是什么,这是非常容易的。 您可以从窗口的右下angularselect编码,将会出现一个对话框提示:

您select的编码('[encoding type]')可能会改变'[Your file]'的内容。 你想从磁盘重新加载文件或转换文本并保存在新的编码?

所以,如果你碰巧有几个字符保存在一些奇怪的编码,你应该做的是先select“重新加载”加载文件中的所有坏字符的编码。 对我来说这个转身? 字符转换成适当的值。

IntelliJ可以告诉你,如果你最有可能没有select正确的编码,并会警告你。 恢复并重试。

一旦你可以看到不好的字符消失,将右下angular的编码select框改回原来的格式(如果你是谷歌search这个错误信息,那很可能是UTF-8)。 这次在对话框中select“转换”button。

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

以下为我编译:

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

看到:

在这里输入图像说明

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

感谢迈克尔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' 

宾果,错误消失了!

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