你的源代码文件有编码问题。 它可能是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} $“;:¬
要解决此问题,请使用UTF-8编码保存源文件。
我正在为在2000年启动的旧版系统在Linux机器上设置CI构build服务器。有一个部分可生成包含非UTF8字符的PDF。 我们正处于发行的最后阶段,所以我不能replace让我悲伤的angular色,但是对于狄尔伯斯特的原因,我不能等待一个星期才能解决这个问题。 幸运的是,Ant中的“javac”命令有一个“encoding”参数。
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表示的字符。取掉这个字符并重新编译。
我在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'
宾果,错误消失了!