“用于编码 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 的不可映射字符”错误的主要内容,如果未能解决你的问题,请参考以下文章

Restkit 对象映射在映射过程中遇到错误

Restkit给出映射错误:

RestKit 映射错误“无法将对象集合映射到非可变集合。”

映射网络硬盘的时候,明明没有设置密码为啥提示密码错误?

postgresql 多对多映射返回错误

Symfony 映射错误:“映射相互不一致”和“关联引用了不存在的反向侧字段”