咖啡机 2011-03-10 16:19
浏览 245
已采纳

如果获取编码信息?

面试的时候,面试官问到这样一个问题:“在项目中,出现乱码的情况,你怎么获得该信息的原编码?”。
(当时就哑了,不知道怎么回答,望大牛们教教)

  • 写回答

3条回答 默认 最新

  • yilong511 2011-03-10 17:28
    关注

    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;

    public class FileEncodeReferee
    {
    private File file;

    public FileEncodeReferee(File file)
    {
        this.file = file;
    }
    
    public FileEncodeReferee(String path)
    {
        file = new File(path);
    }
    
    public String getCharset()
    {
        File file = this.file;
    
        String charset = "GBK";
        byte[] first3Bytes = new byte[3];
        BufferedInputStream bis = null;
        try
        {
            //boolean checked = false;
            bis = new BufferedInputStream(new FileInputStream(file));
            bis.mark(0);
            int read = bis.read(first3Bytes, 0, 3);
            if (read == -1)
            {
                return charset;
            }
            if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE)
            {
                charset = "UTF-16LE";
                //checked = true;
            }
            else if (first3Bytes[0] == (byte) 0xFE
                    && first3Bytes[1] == (byte) 0xFF)
            {
                charset = "UTF-16BE";
                //checked = true;
            }
            else if (first3Bytes[0] == (byte) 0xEF
                    && first3Bytes[1] == (byte) 0xBB
                    && first3Bytes[2] == (byte) 0xBF)
            {
                charset = "UTF-8";
                //checked = true;
            }
            /** *//*******************************************************************
             * bis.reset(); if (!checked) { int loc = 0; while ((read =
             * bis.read()) != -1) { loc++; if (read >= 0xF0) { break; } if (0x80 <=
             * read && read <= 0xBF) // 单独出现BF以下的,也算是GBK { break; } if (0xC0 <=
             * read && read <= 0xDF) { read = bis.read(); if (0x80 <= read &&
             * read <= 0xBF)// 双字节 (0xC0 - 0xDF) { // (0x80 - 0xBF),也可能在GB编码内
             * continue; } else { break; } } else if (0xE0 <= read && read <=
             * 0xEF) { // 也有可能出错,但是几率较小 read = bis.read(); if (0x80 <= read &&
             * read <= 0xBF) { read = bis.read(); if (0x80 <= read && read <=
             * 0xBF) { charset = "UTF-8"; break; } else { break; } } else {
             * break; } } } System.out.println(loc + " " +
             * Integer.toHexString(read)); }
             ******************************************************************/
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (bis != null)
            {
                try
                {
                    bis.close();
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        }
        return charset;
    }
    
    public static void main(String[] args)
    {
        FileEncodeReferee fer = new FileEncodeReferee("E://Huha.csv");
        System.out.println(fer.getCharset());
    }
    

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 Ubuntu20.04无法连接GitHub
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥30 C++行情软件的tick数据如何高效的合成K线