关于LINUX FILE命令是如何判断文件字符集的

今天在使用file -i 查看MYSQLDUMP文件的时候其输出为
charset=us-ascii with very long lines
我导出的文件应该是utf8的,为什么会显示ASCII呢,我们知道ASCII并没有中文编码,那么真的有问题吗?
然后用如下2个小程序测试了一下

点击(此处)折叠或打开

  1. #include<stdio.h>


  2. int main(void)
  3. {
  4.         FILE *p;
  5.         int i=0;
  6.         p=fopen("test11.txt","w+");
  7.         fputs("高鹏\n",p);
  8.         while(i<50000000)
  9.         {
  10.                 fputs("test",p);
  11.                 i++;
  12.         }

  13.         fputs("\n",p);
  14.         fclose(p);
  15.         return 0;
  16. }


点击(此处)折叠或打开

  1. #include<stdio.h>


  2. int main(void)
  3. {
  4.         FILE *p;
  5.         int i=0;
  6.         p=fopen("test10.txt","w+");
  7.         while(i<50000000)
  8.         {
  9.                 fputs("test",p);
  10.                 i++;
  11.         }

  12.         fputs("\n",p);
  13.         fputs("高鹏\n",p);
  14.         fclose(p);
  15.         return 0;
  16. }
实际上并没有什么不同这两个文件 test10 和test11 都有2行其中一个很长的行全部是test字符串,第二行是高鹏
明显他们应该返回UTF8编码,但是并不是
gaopeng@bogon:~$ file -i test10.txt 
test10.txt: text/plain; charset=us-ascii
gaopeng@bogon:~$ file -i test11.txt 
test11.txt: text/plain; charset=utf-8

可以看到如果"高鹏"字符串在第二行返回为ASCII而在第一行为UTF-8,我们可以推测出 file 命令是检测文件开头的某些字符而返回的,并没有全部查看,或者有什么其他算法,但是他不是全部查看。试想如果全部查看一遍 一个200G的备份文件瞬间就返回了结果也是不可能的。
在file的帮助中也明确的写着
   Once file has determined the character set used in a text-type file, it will attempt to determine in what language the file is written.  The language tests
     look for particular strings (cf.  ) that can appear anywhere in the first few blocks of a file.

当然要知道具体的方法估计只有源码。

所以file -i检测的并不一定是正确的字符集。


本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
1.根目录 (/) 的意义与内容 根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机/还原/系统修复等动作有关。 由于系统开机时需要特定的开机软体、核心档案、开机所需程式、函式库等等档案资料,若系统出现错误时,根目录也必须要包含有能够修复档案系统的程式才行。 因此FHS标准建议:根目录(/)所在分割槽应该越小越好, 且应用程式所安装的软体最好不要与根目录放在同一个分割槽内,保持根目录越小越好。 如此不但效能较佳,根目录所在的档案系统也较不容易发生问题。 FHS针
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。 前言 Arena级分析 main arena中的内存申请 thread arena中的申请 内存回收 bin级分析 内存回收 内存分配 chunk级分析 前言 在展开本文之前,先解释一下本文中会提到的三个重要概念:arena,bin,chunk。三者在逻辑上的蕴含关系一般如下图所示(图中的chunk严格来说应该是 Free C
在web容器启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等,servlet规范中通过 ServletContainerInitializer 实现此功能。每个框架要使用 ServletContainerInitializer 就必须在对应的jar包的META-INF/services 目录创建一个名为 javax.servlet.ServletContainerInitializer 的文件,文件内容指定具体的 ServletContainerInitialize
      Java开源Saas开发框架+Activiti流程管理=JSAAS h21.SAAS云应用场景/h2 SAAS云应用近几年来越来越火,这得益于国内云计算的基础设施的发展,如以前我们开发应用所需要的硬件计算资源、平台的操作系统、互联网IP、带宽及域名等,均可以非常有效解决了,企业建设应用或平台,不再需要考虑如何购买这些资源,我们仅需要通过在阿里或腾讯那里购买到这种云服务器即可,这些资源的使用及付费已经做到像交水费及电费那样简单。而现在唯一需要考虑的是在这些云计算资源上如何构建我们需要的企业str

Lucence源码分析---5 - 2016-07-25 22:07:11

lucence源码分析—flush 在前几章的分析中经常遇到flush操作,即当索引的相关数据存入内存中的某些数据结构后,再适当的实际就会通过flush函数将这些数据写入文件中,本章就开始分析flush函数,从DocumentsWriter的doflush函数开始分析,下面来看。 DocumentsWriter::doflush private boolean doFlush (DocumentsWriterPerThread flushingDWPT) throws IOException, Abort

代理模式之简单的动态代理 - 2016-07-25 19:07:30

目录 目录 动态代理定义 重点类和接口 代码示例 代码 代码运行截图 Java 动态代理具体有如下四步骤 美中不足 动态代理定义: 所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个h

[干货] Flume综述与实例 - 2016-07-25 19:07:29

Flume 是一个分布式的、可靠的数据收集、集合和移动的组件。基于流式数据模型,非常健壮、支持容错、故障转移等特性。本用实例辅助说明Flume的大部分核心概念。 版本记录: 2016-07-23 初稿 安装FLume Flume的安装非常简单,其核心就是agent。 从官网下载稳定版本: wget http://apache .fayea .com /flume/ 1.6 .0 /apache-flume- 1.6 .0 -bin .tar .gz tar zxvf apache-flume- 1.6 .
本文由EasyDarwin开源团队成员Alex贡献: http://blog.csdn.net/cai6811376/article/details/52006958 EasyDarwin云平台一直在稳步的升级迭代中,近日,EasyDarwin云平台实现了语音对讲的功能。对讲功能的加入,标志着EasyDarwin云平台进一步的完善。 流程设计 客户端使用POST的方式在body中携带协议报文向云平台发送开始对讲命令; 云平台组织协议报文向指定的设备发送; 设备执行开始对讲命令后向云平台返回相应报文; 云平

Spring事务管理(5)-开启事务 - 2016-07-25 18:07:44

在前几篇文章中,我们分析了Spring的AOP实现,AOP的实现原理即JdkDynamicAop或Cglib。目标方法执行的时候,进入invoke方法中先执行Advisors链。Spring的事务开启需要在目标方法执行前进行,因此可以作为一个前置增强添加到Advisors链中。 Spring的声明式事务配置如下: bean id = "transactionManager" class = "org.springframework.orm.hibernate3.HibernateTransactionMa

Linux之vim学习 - 2016-07-25 18:07:26

vim 分三种模式:一般模式、编辑模式、命令模式 1.一般模式 一般模式下可以进行移动光标、删除、粘贴复制等操作 移动光标操作 h或向左箭头:光标左移动一个字符j或向下箭头:光标下移动一个字符k或向上箭头:光标上移动一个字符l或向右箭头:光标右移动一个字符 30 j:光标下移动 30 个字符ctrl+f:屏幕向下移动一页,相当于Page Down (常用)ctrl+b:屏幕向上移动一页,相当于Page Down (常用)ctrl+d:屏幕向下移动半页ctrl+u:屏幕向上移动半页nspace右移动n个字符