Java &引用;用于编码UTF-8的不可映射字符;错误
我在下面的方法中得到一个编译错误Java &引用;用于编码UTF-8的不可映射字符;错误,java,maven-2,encoding,utf-8,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]的不可映射字符
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]的不可映射字符
enoding UTF-8。第74个字符是''
如何修复此问题?谢谢。以下为我编译:
class E{
String s = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~#;:?/@&!\"'%*=¼.,-])(?=[^\\s]+$).{8,24}$";
}
见:
Java编译器假定您的输入是UTF-8编码的,因为您指定它为UTF-8编码,或者因为它是您的平台默认编码
但是,
.java
文件中的数据实际上并不是用UTF-8编码的。问题可能是、
字符。请确保编辑器(或IDE)“选择”实际上以UTF-8编码保护其文件。编译器正在使用UTF-8字符编码读取源文件。但该文件必须是由编辑器使用其他编码编写的。请在设置为UTF-8编码的编辑器中打开文件,修复引号,然后再次保存
或者,您可以找到字符的Unicode点,并在源代码中使用Unicode转义。例如,字符a
可以替换为Unicode转义\u0041
顺便说一下,当使用
matches()
方法时,您不需要使用开始和结束线锚定^
和$
。当使用matches()
方法时,整个序列必须由正则表达式匹配。锚定仅对find()有用
方法。您的源代码文件存在编码问题。它可能是ISO-8859-1编码的,但编译器设置为使用UTF-8。这将导致在使用字符时出错,UTF-8和ISO-8859-1中的字节表示形式不同。例如,这将发生在所有不属于ASCII的字符上<代码>,
你可以用下面的程序来模拟,它只需要使用你的一行源代码,生成一个ISO-8859-1字节数组,然后解码这个“错误”“使用UTF-8编码。您可以看到线路在哪个位置损坏。我在源代码中添加了两个空格以适应位置74,以适应,
,这是唯一的字符,它将在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])(?=[a-z])(?=[a-z])(?=[a-z])(?=[a-z]:?/@&!”%*=�.,-])(?=[^\s]+$).{8,24}$”;:�
String reg=“^(?=[0-9])(?=[a-z])(?=[a-z])(?=[a-z])(?=[a-z])(?=[a-z])(?=[a-z])(?=[a-z])(?=[a-z])(?=[a-z])(?=[a-z])(?=[a-z])(?=[a-z],-)(?=[s]+$).:
请看“现场直播”
要解决此问题,请使用UTF-8编码保存源文件。“错误:UTF-8编码的不可映射字符”也就是说,java找到了一个在UTF-8中不表示的字符。因此,在编辑器中打开该文件并将字符编码设置为UTF-8。您应该能够找到一个在UTF-8中不表示的字符。去掉该字符并重新编译。我正在为遗留系统在Linux设备上设置CI构建服务器始于2000年。有一个部分生成包含非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>
在eclipse中,尝试转到文件属性(Alt+Enter)并更改
资源
→ '<代码>文本文件编码'→ Other
至UTF-8
。重新打开文件,检查字符串/文件中是否存在垃圾字符。将其删除。保存文件
更改编码资源→ '<代码>文本文件编码返回默认值
编译并部署代码。感谢Michael Konietzka()的回答
我在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文件中添加编码,并解决了这个问题。对于IntelliJ用户,一旦您找到原始编码是什么,这非常容易。您可以从窗口右下角选择编码,您将看到一个对话框提示: 您选择的编码(“[encoding type]”)可能会更改内容 “[您的文件]”的。要从磁盘重新加载文件还是转换 文本是否以新编码保存 因此,如果您碰巧有一些字符保存在一些奇怪的编码中,您应该首先选择“重新加载”以加载文件,所有这些字符都采用坏字符的编码。对我来说,这将?字符转换为正确的值 IntelliJ可以判断您是否很可能没有选择正确的编码,并会警告您。请返回并重试 一旦看到坏字符消失,请将右下角的“编码选择”框更改回您最初想要的格式(如果您用谷歌搜索此错误消息,则可能是UTF-8)。这一次,请选择对话框上的“转换”按钮
对我来说,我需要重新加载为“windows-1252”,然后转换回“UTF-8”。有问题的字符是可能从Word文档(或电子邮件)粘贴的单引号('and')使用错误的编码,上述操作会将它们转换为UTF-8。您将
,
替换为¼
@Luke mhh,这很奇怪,这就是复制/粘贴为我所做的。.我添加了gvim窗口的屏幕截图。无论如何,我并没有真正回答这个问题,所以我将使这个CW与我的Eclipse一起编译,但是T的中间部分看起来有点奇怪,你确定问题是“”而不是“”吗?你试过用其他编辑器保存文件并确保编码是UTF-8吗?我所做的是打开所讨论的文件(希望你可以推断出它抱怨的是哪个文件)。
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'