文本的内容是utf字符串串进行utf8编码后的内容,那么如何读取原来的真正内容?

博客分类:
一、查看文件编码。
&&& 在打开文件的时候输入:set fileencoding
&&& 即可显示文件编码格式。
二、文件编码转换
&&& 1、在Vim中直接进行转换文件编码,比如将一个文件转换成utf-8格式
&&&&&&& 在打开的文件中输入:set fileencoding=utf-8
&&& 2、使用iconv转换,iconv的命令格式如下:
&&&&&&& iconv -f encoding -t encoding inputfile
&&&&&&& 比如将一个 编码的文件转换成GBK编码
&&&&&&& iconv -f UTF-8 -t GBK file1 -o file2
iconv的用法:
用法: iconv [选项...] [文件...]
Convert encoding of given files from one encoding to another.
输入/输出格式规范:
& -f, --from-code=NAME&&&&&& 原始文本编码
& -t, --to-code=NAME&&&&&&&& 输出编码
信息:
& -l, --list&&&&&&&&&&&&&&&& 列举所有已知的字符集
输出控制:
& -c&&&&&&&&&&&&&&&&&&&&&&&& 从输出中忽略无效的字符
& -o, --output=FILE&&&&&&&&& 输出文件
& -s, --silent&&&&&&&&&&&&&& suppress warnings
&&&&& --verbose&&&&&&&&&&&&& 打印进度信息
& -?, --help&&&&&&&&&&&&&&&& 给出该系统求助列表
&&&&& --usage&&&&&&&&&&&&&&& 给出简要的用法信息
& -V, --version&&&&&&&&&&&&& 打印程序版本号
将GB2312编码的文件内容转换为UTF-8
iconv -f GB2312 -t UTF-8 file-name & new-file-name
将UTF-8编码的文件内容转换为GB2312
iconv -f UTF-8 -t GB2312 file-name & new-file-name
注意:转换前一定要将重要的文件备份,特别是转换文件内容的时候
三、文件名编码转换:
&&& 从linux往windows拷贝文件或者从windows往Linux拷贝文件,有时会出现中文文件名乱码的情况,出现这种问题的原因是因为,windows的文件名 中文编码默认为GBK,而Linux中默认文件名编码为UTF8,由于编码不一致,所以导致了文件名乱码的问题,解决这个问题需要对文件名进行转码。
&&& 在Linux中专门提供了一种工具convmv进行文件名编码的转换,可以将文件名从GBK转换成UTF-8编码,或者从UTF-8转换到GBK。
&&& 1、先看一下你的系统上是否安装了convmv,如果没安装的话在终端输入下面的命令安装:
&&&&&& sudo yum -y install convmv
&&& 2、下面看一下convmv的具体用法:
&&&&&& convmv -f 源编码 -t 新编码 [选项] 文件名
&&&&&& 常用参数:
&&&&&&&&& -r 递归处理子文件夹
&&&&&&&&& --notest 真正进行操作,请注意在默认情况下是不对文件进行真实操作的,而只是试验。
&&&&&&&&& --list 显示所有支持的编码
&&&&&&&&& --unescap 可以做一下转义,比如把%20变成空格
&&& 比如我们有一个utf8编码的文件名,转换成GBK编码,命令如下:
&&& convmv -f UTF-8 -t GBK --notest utf8编码的文件名
&&& 这样转换以后"utf8编码的文件名"会被转换成GBK编码(只是文件名编码的转换,文件内容不会发生变化)
浏览 31398
浏览: 322119 次
来自: 广州
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'UTF-8编码的文本文档,有的带有BOM (Byte Order Mark, 字节序标志),即0xEF, 0xBB, 0xBF,有的没有。Windows下的txt文本编辑器在保存UTF-8格式的文本文档时会自动添加BOM到文件头。在判断这类文档时,可以根据文档的前3个字节来进行判断。然而BOM不是必需的,而且也不是推荐的。对不希望UTF-8文档带有BOM的程序会带来兼容性问题,例如Java编译器在编译带有BOM的UTF-8源文件时就会出错。而且BOM去掉了UTF-8一个期望的特性,即是在文本全部是ASCII字符时UTF-8是和ASCII一致的,即UTF-8向下兼容ASCII。在具体判断时,如果文档不带有BOM,就无法根据BOM做出判断,而且IsTextUnicode API也无法对UTF-8编码的Unicode字符串做出判断。那在编程判断时就要根据UTF-8字符编码的规律进行判断了。UTF-8是一种多字节编码的字符集,表示一个Unicode字符时,它可以是1个至多个字节,在表示上有规律:1字节:0xxxxxxx2字节:110xxxxx 10xxxxxx3字节:1110xxxx 10xxxxxx 10xxxxxx4字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx这样就可以根据上面的特征对字符串进行遍历来判断一个字符串是不是UTF-8编码了。应该指出的是UTF-8字符串的各个字节的取值有一定的范围,并不是所有的值都是有效的UTF-8字符,但是一般的应用的情况下这样的判断在对足够长的字符串及是比较精确了,而且实现也比较简单。具体的字节取值范围可以参见"Unicode Explained"一书中的6.4.3。另外BOM本身也符合3字节UTF-8字符编码规律,所以本方法对带BOM的UTF-8字符串也是有效的。
1. 判断文本是否UTF编码
在下面程序中对最大3字节长的UTF-8字符进行了判断,在实际情况下,几乎所有能用到的UTF-8字符最长就是3个字节
1 bool IsUTF8(const void* pBuffer, long size)
bool IsUTF8 = true;
unsigned char* start = (unsigned char*)pB
unsigned char* end = (unsigned char*)pBuffer +
while (start & end)
if (*start & 0x80) // (): 值小于0x80的为ASCII字符
else if (*start & (0xC0)) // (): 值介于0x80与0xC0之间的为无效UTF-8字符
IsUTF8 = false;
else if (*start & (0xE0)) // (): 此范围内为2字节UTF-8字符
if (start &= end - 1)
if ((start[1] & (0xC0)) != 0x80)
IsUTF8 = false;
start += 2;
else if (*start & (0xF0)) // (): 此范围内为3字节UTF-8字符
if (start &= end - 2)
if ((start[1] & (0xC0)) != 0x80 || (start[2] & (0xC0)) != 0x80)
IsUTF8 = false;
start += 3;
IsUTF8 = false;
return IsUTF8;
2. 判断文件是否UTF-8编码:
1 bool CConvertCharset::IsUTF8File(const char* pFileName)
FILE *f = NULL;
fopen_s(&f, pFileName, "rb");
if (NULL == f)
return false;
fseek(f, 0, SEEK_END);
long lSize = ftell(f);
fseek(f, 0, SEEK_SET);
//或rewind(f);
char *pBuff = new char[lSize + 1];
memset(pBuff, 0, lSize + 1);
fread(pBuff, lSize, 1, f);
fclose(f);
bool bIsUTF8 = IsUTF8Text(pBuff, lSize);
delete []pB
pBuff = NULL;
return bIsUTF8;
阅读(...) 评论()UTF-8编码_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&100W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
阅读已结束,下载本文需要
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩1页未读,
定制HR最喜欢的简历
你可能喜欢今天遇到一个奇葩问题,在读取一个TXT文件时,出现开头多了一个问号(?)。如下图:
莫名奇妙的多了一个。最后通过网上资料,知道在中,class文件采用utf8的编码方式,JVM运行时采用utf16。的字符串是永远都是unicode的,采用的是UTF-16的编码方式。想一下,java对UTF-8文件的读写的能力,结果发现了一个很郁闷的问题,如果通过java写的UTF-8文件,使用Java可以正确的读,但是如果用记事本将相同的内容使用UTF-8格式保存,则在使用程序读取是会从文件中多读出一个不可见字符。
测试代码如下:
Java代码&&
import&java.io.BufferedR&&
import&java.io.F&&
import&java.io.FileInputS&&
import&java.io.IOE&&
import&java.io.InputStreamR&&
public&class&UTF8Test&{&&
&&&&public&static&void&main(String[]&args)&throws&IOException&{&&
&&&&&&&&File&f&&=&new&File("./utf.txt");&&
&&&&&&&&FileInputStream&in&=&new&FileInputStream(f);&&
&&&&&&&&BufferedReader&br&=&new&BufferedReader(new&InputStreamReader(in,&"UTF-8"));&&
&&&&&&&&&&
&&&&&&&&String&line&=&br.readLine();&&
&&&&&&&&while(line&!=&null)&&
&&&&&&&&{&&
&&&&&&&&&&&&System.out.println(line);&&
&&&&&&&&&&&&line&=&br.readLine();&&
&&&&&&&&}&&
utf.txt通过记事本创建,另存时使用指定utf-8编码,其内容为:
This is the first line.This is second line.
正常的测试结果应该是直接输出utf.txt的文本内容。可是实际上却输出了下面的内容:
?This is the first line.This is second line.
第一行多出了一个问号。通过上面的几篇文章应该可以想到是Java读取BOM(Byte Order Mark)的问题,在使用UTF-8时,可以在文件的开始使用3个字节的"EF BB BF"来标识文件使用了UTF-8的编码,当然也可以不用这个3个字节。上面的问题应该就是因为对开头3个字节的读取导致的。开始不太相信这个是JDK的Bug,后来在多次试验后,问题依然存在,就又狗狗了一下,果然找到一个如下的Bug:不过在我关掉的一些页面中记得有篇文件说这个bug只在jdk1.5及之前的版本才有,说是1.6已经解决了,从目前来看1.6只是解决了读取带有BOM文件失败的问题,还是不能区别处理有BOM和无BOM的UTF-8编码的文件,从Bug ID:4508058里的描述可以看出,这个问题将作为一个不会修改的问题关闭,对于BOM编码的识别将由应用程序自己来处理,原因可从另处一个bug处查看到,因为Unicode对于BOM的编码的规定可能发生变化。也就是说对于一个UTF-8的文件,应用程序需要知道这个文件有没有写BOM,然后自己决定处理BOM的方式。
解决办法:
1.保存时,选择
2.引用正确的读取类,比如我用的就是:org.apache.commons.io.FileUtils.readFileToString(new File(file), encoding);
ps:贴一下读取的工具类源码:
* 读入文件到字串中
* @param file 需要读取的文件路径
* @return 读取的文件内容,若读入失败,则返回空字串
public static String readFileToString(String file, String encoding)
<span style="color: #
<span style="color: #
if (StringHelper.isEmpty(encoding))
<span style="color: #
<span style="color: #
encoding = "GBK";
<span style="color: #
<span style="color: #
String content = org.apache.commons.io.FileUtils.readFileToString(new File(file), encoding);
<span style="color: #
<span style="color: #
<span style="color: #
catch (IOException ex)
<span style="color: #
<span style="color: #
logger.error("读取文件出错", ex);
<span style="color: #
<span style="color: #
return "";
<span style="color: #
注意两点都要过一下,希望有用。
阅读(...) 评论()最近在做文本编辑器,在读取文本文件时出现乱码现象,GBK转 UTF-8简单,但是怎么去判断该文本文件读取流是不是GBK或者是UTF-8烦恼了好几天,尝试了好多方案都不太靠谱,无意中找到的一个方法测试挺管用的,记录一下,下次不用到处找了,直接上代码:
package cn.com.demo.
import java.io.UnsupportedEncodingE
public class Utf8Util {
* UTF-8编码规则
Bits of code point
First code point
Last code point
Bytes in sequence
U+7FFFFFFF
public static boolean isUtf8(byte[] bytes) {
boolean flag = false;
if (bytes != null && bytes.length & 0) {
boolean foundStartByte = false;
int requireByte = 0;
for (int i = 0; i & bytes. i++) {
byte current = bytes[i];
if ((current & 0x80) == 0x00) {
if (foundStartByte) {
foundStartByte = false;
requireByte = 0;
}else if ((current & 0xC0) == 0xC0) {
foundStartByte = true;
requireByte = 1;
}else if ((current & 0xE0) == 0xE0) {
foundStartByte = true;
requireByte = 2;
}else if ((current & 0xF0) == 0xF0) {
foundStartByte = true;
requireByte = 3;
}else if ((current & 0xE8) == 0xE8) {
foundStartByte = true;
requireByte = 4;
}else if ((current & 0xEC) == 0xEC) {
foundStartByte = true;
requireByte = 5;
}else if ((current & 0x80) == 0x80) {
if (foundStartByte) {
requireByte--;
if (requireByte == 0) {
return true;
return false;
return false;
return false;
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "&a href=\"http://www.baidu.com\"&百度一下&/a&";
System.out.println(Utf8Util.isUtf8(str.getBytes("utf-8")));
System.out.println(Utf8Util.isUtf8(str.getBytes("gbk")));
流读取数据的时候字符乱码的终极解决办法。
获取编码,以及转换编码格式
java判断txt文件的编码格式
Java中以指定编码方式读取字符流
没有更多推荐了,

我要回帖

更多关于 js字符串转utf8编码 的文章

 

随机推荐