我在以下方法中遇到编译错误。
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' " '
我该如何解决这个问题?感谢。
答案 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} $”;:¬
要解决此问题,请使用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}$";
}
见:
答案 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