“用于编码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