using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;

namespace Wordsearch1
{
public class FileEncoding
{
public FileEncoding()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

/// <summary>
/// 取得一个文本文件的编码方式。如果无法在文件头部找到有效的前导符,Encoding.Default将被返回。
/// </summary>
/// <param name="fileName">文件名。</param>
/// <returns></returns>
public static Encoding GetEncoding(string fileName)
{
return GetEncoding(fileName, Encoding.Default);
}

/// <summary>
/// 取得一个文本文件流的编码方式。
/// </summary>
/// <param name="stream">文本文件流。</param>
/// <returns></returns>
public static Encoding GetEncoding(FileStream stream)
{
return GetEncoding(stream, Encoding.Default);
}

/// <summary>
/// 取得一个文本文件的编码方式。
/// </summary>
/// <param name="fileName">文件名。</param>
/// <param name="defaultEncoding">默认编码方式。当该方法无法从文件的头部取得有效的前导符时,将返回该编码方式。</param>
/// <returns></returns>
public static Encoding GetEncoding(string fileName, Encoding defaultEncoding)
{
FileStream fs = new FileStream(fileName, FileMode.Open);
Encoding targetEncoding = GetEncoding(fs, defaultEncoding);
fs.Close();
return targetEncoding;
}

/// <summary>
/// 取得一个文本文件流的编码方式。
/// </summary>
/// <param name="stream">文本文件流。</param>
/// <param name="defaultEncoding">默认编码方式。当该方法无法从文件的头部取得有效的前导符时,将返回该编码方式。</param>
/// <returns></returns>
public static Encoding GetEncoding(FileStream stream, Encoding defaultEncoding)
{
Encoding targetEncoding = defaultEncoding;
if (stream != null && stream.Length >= 2)
{
//保存文件流的前4个字节
byte byte1 = 0;
byte byte2 = 0;
byte byte3 = 0;
byte byte4 = 0;
//保存当前Seek位置
long origPos = stream.Seek(0, SeekOrigin.Begin);
stream.Seek(0, SeekOrigin.Begin);

int nByte = stream.ReadByte();
byte1 = Convert.ToByte(nByte);
byte2 = Convert.ToByte(stream.ReadByte());
if (stream.Length >= 3)
{
byte3 = Convert.ToByte(stream.ReadByte());
}
if (stream.Length >= 4)
{
byte4 = Convert.ToByte(stream.ReadByte());
}

//根据文件流的前4个字节判断Encoding
//Unicode {0xFF, 0xFE};
//BE-Unicode {0xFE, 0xFF};
//UTF8 = {0xEF, 0xBB, 0xBF};
if (byte1 == 0xFE && byte2 == 0xFF)//UnicodeBe
{
targetEncoding = Encoding.BigEndianUnicode;
}
if (byte1 == 0xFF && byte2 == 0xFE && byte3 != 0xFF)//Unicode
{
targetEncoding = Encoding.Unicode;
}
if (byte1 == 0xEF && byte2 == 0xBB && byte3 == 0xBF)//UTF8
{
targetEncoding = Encoding.UTF8;
}

//恢复Seek位置
stream.Seek(origPos, SeekOrigin.Begin);
}
return targetEncoding;
}
}
}

转载于:https://www.cnblogs.com/myleeblog/p/5510904.html

文件字符流 编码判断相关推荐

  1. 基本文件字符流FileWriter、FileReader

    详细介绍了Java IO中的基本文件字符流FileWriter.FileReader的方法以及使用方式. 文章目录 1. IO流概述 2 FileWriter文件字符输出流 2.1 构造器 2.2 A ...

  2. Java的知识点29—— 文件字符流、字节数组流

    文件字符流 FileReader  FileWriter 分段读取 文件字符输入流 package cn.dym; import java.io.File; import java.io.FileNo ...

  3. .dat文件写入byte类型数组_文件字节流、文件字符流、缓冲字节流、缓冲字符流字节数组流、数据流、转换流、对象流...

    一.实操名称: 描述如下流的基本作用:文件字节流.文件字符流.缓冲字节流.缓冲字符流字节数组流.数据流.转换流.对象流二.描述1.文件字节流:包括:FileInputStream,FileOutput ...

  4. 1.文件字符流:什么是文件字符流???

    1.文件字符流:什么是文件字符流??? 学习:第7遍 1.什么是文件字符流??? Reader是字符输入流的顶层父类,直接子类:6个 Reader常用子类: FileReader BufferedRe ...

  5. 文件字符流(FileReader/FileWriter)

    文件字符流(FileReader/FileWriter)针对文件字符的操作,不同于文件字节流(FileInputStream/FileOutputStream).它是针对字符来进行操作的,因此他在处理 ...

  6. 20170118:File类与IO流,File类,IO流的基本原理,IO流的分类,文件字节流与文件字符流

    一.File类 1.java.io.File类代表系统文件(文件和目录) 访问文件属性步骤 1). 创建文件对象:File file = new File(String pathname); 2). ...

  7. java 文件字节流_Java:文件字符流和字节流的输入和输出

    最近在学习Java,所以就总结一篇文件字节流和字符流的输入和输出. 总的来说,IO流分类如下: 输入输出方向:     输入流(从外设读取到内存)和输出流(从内存输出到外设) 数据的操作方式: 字节流 ...

  8. Java_文件字符流说明

    FileReader和FileWrite介绍 FileReader和FileWriter是字符流,即按照字符来操作io FileReader相关方法: new FileReader(File/Stri ...

  9. 【Java-IO】File、搜索删除剪切、字符集、字符编码、字节流、将内存中的数据写入文件、字符流、缓冲流、Scanner、格式化输出、数据流、对象流、序列化与反序列化、Files工具类

    IO 文章目录 IO 简介 File 分隔符.大小写 常用方法 练习:搜索.删除.剪切 字符集(Character Set) 字符编码(Character Encoding) 字符编码比较 乱码 字节 ...

最新文章

  1. Excel函数公式 (日期函数)
  2. 【原】Spark Standalone模式
  3. 一步步编写操作系统 37 一级页表与虚拟地址2
  4. leetcode - 1223. 掷骰子模拟
  5. 重做 oracle_Oracle数据库基本知识(1)-数据库(1)
  6. pycharm的项目文件中包括什么_一个完整的项目管理流程包括什么?
  7. 获取系统当前时间(精确到毫秒)
  8. 如何在古董级IPAD上修改植物大战僵尸游戏金币
  9. pip 安装 sklearn 教程
  10. 抖音视频怎么下载MP4格式怎么转换为MP3
  11. Scratch3.0创意编程(基础篇):第11课 智能小车
  12. java求两点间的距离_java计算两点间的距离方法总结
  13. NCRE公共基础知识(一) 计算机系统
  14. 如何查看自己的电脑是32位机器还是64位机器
  15. Discuz!x1.5实现在线文档(doc、ppt、pdf)播放
  16. 基础语法值c++提高编程
  17. Android进阶_Handler和Handler.Callback和Message
  18. python中列表概念_详解python列表
  19. PRML 1.1 多项式曲线拟合
  20. win10 创建访客_建立一个访客会很喜欢的网站

热门文章

  1. 数据库入门经典基础总结
  2. shell 中的return
  3. 阿里团队高效沟通的秘密,全在这5点!
  4. 图解Spring循环依赖,看过之后再也不怕面试被问到了!
  5. 原创 | 我被面试官给虐懵了,竟然是因为我不懂Spring中的@Configuration
  6. 预见未来 | 数据智能的现在与未来
  7. 电商系统设计之商品(下)
  8. 现代环境下的网络分割
  9. 用Kotlin写一个基于Spring Boot的RESTful服务
  10. 6.Hibernate综述