“用于编码 UTF-8 的不可映射字符”错误
Posted
技术标签:
【中文标题】“用于编码 UTF-8 的不可映射字符”错误【英文标题】:"Unmappable character for encoding UTF-8" error 【发布时间】:2011-06-27 01:46:39 【问题描述】:我在以下方法中遇到编译错误。
public static boolean isValidPasswd(String passwd)
String reg = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~#;:?/@&!\"'%*=¬.,-])(?=[^\\s]+$).8,24$";
return Pattern.matches(reg, passwd);
在 Utility.java:[76,74] 不可映射的字符
编码 UTF-8。第 74 个字符是'"'
我该如何解决这个问题?谢谢。
【问题讨论】:
用我的 Eclipse 编译得很好,但是中间的 '¬' 看起来有点奇怪,你确定问题出在 '"' 而不是 '¬' 上吗?你试过保存文件吗使用其他编辑器并确保编码为 UTF-8? 我所做的是打开有问题的文件(希望你能推断出它抱怨的是哪个文件)。然后我再次保存了文件(在写了几个随机字符来注册更改后,然后删除它们)。然后重新保存后,我可以编译。我想重新保存会以您操作系统的本机方式保存文件。 【参考方案1】:您的源代码文件存在编码问题。它可能是 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])(?=. em>[~#;:?/@&!"'%*=�.,-])(?=[^\s]+$).8,24$";: �
String reg = "^(?=.[0-9])(?=.[az])(?=.[AZ])(?=. em>[~#;:?/@&!"'%*=¬.,-])(?=[^\s]+$).8,24$";: ¬
在https://ideone.com/ShZnB观看“直播”
要解决此问题,请使用 UTF-8 编码保存源文件。
【讨论】:
谢谢迈克尔!我在从旧 cvs 服务器签出的 java 项目中遇到了类似的问题。所以,为了解决它,我做了 - Determine and change file character encoding: find -name '*.java' -exec recode Latin-1..UTF-8 \; 答案对于如何使用 UTF-8 编码保存源文件的示例很有帮助。谢谢! @kellyfj 这当然取决于用户使用的编辑器。我想每个编辑器都有一些用于这种选项的菜单。 帮了我!!谢谢。我在代码中的一条注释中有“-”字符,这导致了问题【参考方案2】:我正在为 2000 年开始的旧系统在 Linux 机器上设置 CI 构建服务器。有一个部分会生成包含非 UTF8 字符的 PDF。我们正处于发布的最后一步,所以我无法替换让我悲伤的角色,但出于 Dilbertesque 的原因,我不能在发布后等待一周来解决这个问题。幸运的是,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>
【讨论】:
【参考方案3】:Java 编译器假定您的输入是 UTF-8 编码的,因为您指定它是,或者因为它是您的平台默认编码。
但是,.java
文件中的数据实际上并未以 UTF-8 编码。问题可能是¬
字符。确保您选择的编辑器(或 IDE)实际上以 UTF-8 编码保护其文件。
【讨论】:
【参考方案4】:在 Eclipse 中尝试转到文件属性 (Alt+Enter) 并将 Resource
→ 'Text File encoding
' → Other
更改为 UTF-8
.重新打开文件并检查字符串/文件中的某处是否有垃圾字符。去掉它。保存文件。
将编码资源 → 'Text File encoding
' 改回默认值。
编译并部署代码。
【讨论】:
【参考方案5】:对于 IntelliJ 用户,一旦您找出原始编码是什么,这将非常容易。您可以从窗口的右下角选择编码,系统会提示您:
您选择的编码('[编码类型]')可能会改变内容 '[你的文件]'。你想从磁盘重新加载文件还是转换 文本并保存在新编码中?
因此,如果您碰巧有一些字符以某种奇怪的编码保存,您应该首先选择“重新加载”以将文件全部加载为错误字符的编码。对我来说,这变成了?将字符转换为正确的值。
IntelliJ 可以判断您是否很可能没有选择正确的编码,并会警告您。恢复并重试。
当您看到坏字符消失后,将右下角的编码选择框改回您最初想要的格式(如果您在谷歌上搜索此错误消息,那可能是 UTF-8)。这次选择对话框上的“转换”按钮。
对我来说,我需要重新加载为“windows-1252”,然后转换回“UTF-8”。有问题的字符是单引号(‘和’),可能是从 Word 文档(或电子邮件)中以错误编码粘贴的,上述操作会将它们转换为 UTF-8。
【讨论】:
【参考方案6】:编译器正在使用 UTF-8 字符编码来读取您的源文件。但是该文件必须是由使用不同编码的编辑器编写的。在设置为 UTF-8 编码的编辑器中打开文件,修正引号,然后再次保存。
或者,您可以找到字符的 Unicode 点并在源代码中使用 Unicode 转义。例如,字符 A
可以替换为 Unicode 转义符 \u0041
。
顺便说一句,在使用matches()
方法时,您不需要使用开头和结尾的锚点^
和$
。使用matches()
方法时,必须用正则表达式匹配整个序列。锚点仅对 find()
方法有用。
【讨论】:
【参考方案7】:感谢 Michael Konietzka (https://***.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'
宾果游戏,错误消失了!
【讨论】:
【参考方案8】:以下为我编译:
class E
String s = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~#;:?/@&!\"'%*=¼.,-])(?=[^\\s]+$).8,24$";
见:
【讨论】:
您已将¬
替换为 ¼
。
@Luke mhh 这很奇怪,这就是复制/粘贴对我的作用.. 我添加了我的 gvim 窗口的屏幕截图。无论如何,我并没有真正回答这个问题,所以我会制作这个 CW。【参考方案9】:
"error: unmappable character for encoding UTF-8" 的意思是,java 找到了一个不代表 UTF-8 的字符。因此,在编辑器中打开文件并将字符编码设置为 UTF-8。你应该能找到一个UTF-8没有表示的字符。去掉这个字符并重新编译。
【讨论】:
【参考方案10】:我在使用 Eclipse 时发现了这个问题。我需要在我的 pom.xml 文件中添加编码并解决了。 http://ctrlaltsolve.blogspot.in/2015/11/encoding-properties-in-maven.html
【讨论】:
请避免仅链接的答案。在帖子中详细说明解决方案。 链接失效了,能补充详细回答吗?以上是关于“用于编码 UTF-8 的不可映射字符”错误的主要内容,如果未能解决你的问题,请参考以下文章