`
frank1998819
  • 浏览: 758668 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类

UTF-8 illegal character (转)

    博客分类:
  • Java
 
阅读更多

今天在代码打包时报如下错误::1: illegal character: 5279

查看文件确实是UTF-8的最后在高人指点下看到

http://blog.csdn.net/shixing_11/article/details/6976900

这篇blog,总算明白什么原因了,与这个几乎完全一样的问题

网上看到了很多解决方法,一番折腾后还是我的工具比较神器NotePad++自带去除BOM功能

图片一所示的是当前查看视图,如果要修改格式就选择图片2标记的地方

 

 

 

表面看着该文件确实没错,看不出来问题,后来从SVN上更新下代码以后,发现本地也不报错,后来通过Eclipse查看了该xxx.java类的属性,才发现玄机所在:

 

编译有问题的文件属性:(注意最下面一行 Byte Order Mark is UTF-8 (BOM)

编译正常的文件属性:

看来问题出在 Byte Order Mark is UTF-8 (BOM)上。因为看不出来问题,所以用UltraEdit打开两个文件,并用16进制格式显示:

有问题的文件头:

无问题的文件头:

看来有问题的文件头前面多了三个字节EF BB BF。

具体原因如下:

某些编辑器会往utf8文件中添加utf8标记(editplus称其为签名),它会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM),它的表示的是 Unicode 标记(BOM)。 因此要解决这个问题的关键就是把这个标记选项去掉,可按如下方法操作。
首先用editplus打开这个文件,从Doucument菜单中选择Permanet Settings,有三个分类,分别是General,File, Tools.点击File,右边会有一项是 UTF-8 signature: 选择 always remove signature. 点击OK 。中文版本的 Editplus 下操作的菜单结构如下: 文档->参数设置->文件->UTF-8签名->总是移除签名->确定 ,这样就设置了UTF-8格式不需要在文件前面加标记,最后把文件另存为utf-8格式就好了.

相关资料,网上摘抄:

UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。Windows就是使用BOM来标记文本文件的编码方式的。原来BOM是在文件的开始加了几个字节作为标记。

扩展阅读:

UTF-8, UTF-16, UTF-32 & BOM:http://www.unicode.org/faq/utf_bom.html#BOM

W3C官方说明:http://www.w3.org/International/questions/qa-utf8-bom

参见:

http://baifjece.blog.163.com/blog/static/337946542011113015829596/

http://www.arkulo.com/?post=57

http://blog.csdn.net/shixing_11/article/details/6976900

分享到:
评论

相关推荐

    php iconv() : Detected an illegal character in input string

    上线后报一堆这样的错:iconv() : Detected an illegal character in input string考虑到GB2312字符集比较小,换个大的吧,于是改成GBK:$str = iconv(‘UTF-8’, ‘GBK’, unescape(isset($_GET[‘str’])?...

    MySQL 编码utf8 与 utf8mb4 utf8mb4_unicode_ci 与 utf8mb4_general_ci

    然而,MySQL中的`utf8`字符集并不完全符合标准的UTF-8,因为它只支持最大3个字节的编码,这意味着某些4字节的UTF-8字符(如表情符号)无法存储。为了解决这个问题,MySQL引入了`utf8mb4`字符集,它完全支持4字节的...

    cleanbom:从adt迁移到android studio有可能出现:编译Java产生 illegal character

    cleanbom编译Java产生 illegal character: \65279 错误的问题是由于Windows系统开发的编码为UTF-8(BOM)导致,BOM是Byte-Order Mark的意思。一种为了让编辑器自动识别编码。在文件前3个字节加上了EE,BB,BF,但标准的...

    python中open文本写入字符串时编码报错问题

    console报错信息:UnicodeEncodeError: ‘gbk’ codec can’t encode ...用utf-8编码格式open文件,如下: with open(file_path,'w+',encoding='utf-8') 忽略该错误,在open()中加入errors=‘ignore’,如下: wit

    Java Base64编码和解码

    只要原始的字节数组能够正确表示中文字符(比如使用UTF-8编码),Base64编码后的结果就能正确解码回中文。 在提供的`Base64.java`文件中,我们可以预计它实现了一个自定义的Base64编码和解码功能。这个程序可能包含...

    base64转换遇到问题解决方法

    2. 对于字符编码问题,可以使用UTF-8编码来解决中文字符的编码问题。 BASE64转换的应用 BASE64转换有很多应用,例如: 1. 图像上传:可以使用BASE64转换将图像数据转换为文本格式,以便于在网络上传输。 2. 文件...

    python爬取表格 ‘gbk’ codec can’t encode character ‘\U0001f370’ in position 5: illegal multibyte sequence

    在写爬虫,往csv写入文件时候报错 'gbk' codec can't encode character '\U0001f370' in ...设置csv文件位UTF-8,代码改为 for i in b: persons = str(i).replace('u','').replace('\'','') print(persons) wit

    Mysql彻底解决中文乱码问题的方案(Illegal mix of collations for operation)

    这将设置客户端的默认字符集为UTF-8,避免传输数据时的编码问题。 保存并退出后,你需要重启MySQL服务以应用更改。在Linux上,可以使用以下命令: ``` /etc/init.d/mysql stop /etc/init.d/mysql start ``` 接下来...

    MySql表字符集问题[参考].pdf

    GBK是双字节字符集,UTF-8是三字节字符集,因此对于主键字段,GBK最大支持384个字符,而UTF-8最大支持256个字符。 解决键长度超限问题通常需要缩短字段长度或者考虑分拆主键,或者调整数据库设计以适应新的字符集...

    php使用iconv中文截断问题的解决方法

    目标页面的编码格式是GB2312,而本地服务器的编码格式为UTF-8。在进行编码转换的过程中,使用了PHP内置的iconv函数。 iconv函数是PHP中用于字符串编码转换的一个函数,它能把字符串从一种字符编码转换为另一种。...

    Bochs - The cross platform IA-32 (x86) emulator

    Changes in 2.4.6 (February 22, 2011): Brief summary : - Support more host OS to run on: - Include win64 native binary in the release. - Fixed failures on big endian hosts. - BIOS: Support for up to...

    Character.UnicodeBlock中cjk的说明详解

    return String.valueOf(c).getBytes("UTF-8").length > 1; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return false; } } ``` * 验证字符串内容是否包含非法字符: ```java public ...

    MySQL中日期比较时遇到的编码问题解决办法

    这意味着,当date_format返回的日期字符串中包含非ASCII字符(例如,某些语言的月份或星期名称)时,其字符集可能是UTF-8或其他非二进制字符集。 另一方面,timediff函数计算两个日期或时间之间的差值,返回一个...

    java中文及特殊字符的校验方法

    return String.valueOf(c).getBytes("UTF-8").length > 1; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return false; } } ``` 校验特殊字符 在 Java 中,可以使用以下方法来校验特殊...

Global site tag (gtag.js) - Google Analytics