openoffice將txt文本轉pdf中文亂碼

問題描述:java

   使用openoffice將txt文本轉pdf的過程當中發現中文亂碼。測試

解決思路及過程:編碼

 一、查看出現亂碼的緣由spa

      經查詢jodconverter源碼發現,只有utf-8編碼的文本纔不會中文亂碼。code

 二、怎麼樣將非utf-8編碼文件轉換成utf-8文件。utf-8

      要轉以前首先要判斷txt文本自己的編碼。經查發現txt文本有一個頭。ci

  判斷方法以下unicode

/**
     * 根據文件路徑返回文件編碼
     * @param filePath
     * @return
     * @throws IOException
     */
    public static String getCharset(String filePath) throws IOException{  
        BufferedInputStream bin = new BufferedInputStream(new FileInputStream(
                filePath));
        int p = (bin.read() << 8) + bin.read();
        String code = null;
 
        switch (p) {
        case 0xefbb:
            code = "UTF-8";
            break;
        case 0xfffe:
            code = "Unicode";
            break;
        case 0xfeff:
            code = "UTF-16";
            break;
        default:
            code = "GB2312";
        }
      System.out.println(code);
        return code;  
  }

轉換代碼以下get

/** 
     * 以指定編碼方式寫文本文件,存在會覆蓋 
     *  
     * @param file 
     *            要寫入的文件 
     * @param toCharsetName 
     *            要轉換的編碼 
     * @param content 
     *            文件內容 
     * @throws Exception 
     */  
    public static void saveFile2Charset(File file, String toCharsetName,  
            String content) throws Exception {  
        if (!Charset.isSupported(toCharsetName)) {  
            throw new UnsupportedCharsetException(toCharsetName);  
        }  
        OutputStream outputStream = new FileOutputStream(file);  
        
        OutputStreamWriter outWrite = new OutputStreamWriter(outputStream,  
                toCharsetName);  
        outWrite.write(content);  
        outWrite.close();  
    }

經測試發現,轉換後的文本,獲取的頭仍是gbk的,只有手機將頭文件中blob生成  源碼

代碼以下:

/** 
     * 以指定編碼方式寫文本文件,存在會覆蓋 
     *  
     * @param file 
     *            要寫入的文件 
     * @param toCharsetName 
     *            要轉換的編碼 
     * @param content 
     *            文件內容 
     * @throws Exception 
     */  
    public static void saveFile2Charset(File file, String toCharsetName,  
            String content) throws Exception {  
        if (!Charset.isSupported(toCharsetName)) {  
            throw new UnsupportedCharsetException(toCharsetName);  
        }  
        OutputStream outputStream = new FileOutputStream(file);  
        //增長頭文件標識
        outputStream.write(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF});  
        OutputStreamWriter outWrite = new OutputStreamWriter(outputStream,  
                toCharsetName);  
        outWrite.write(content);  
        outWrite.close();  
    }

經測試

GB2312
Unicode
UTF-16
UTF-8
 都成功。

txt編碼和頭文件說明

java編碼與txt編碼對應

java

txt

unicode

unicode big endian

utf-8

utf-8

utf-16

unicode

gb2312

ANSI

 

什麼是BOM

BOM(byte-order mark),即字節順序標記,它是插入到以UTF-八、UTF16或UTF-32編碼Unicode文件開頭的特殊標記,用來識別Unicode文件的編碼類型。對於UTF-8來講,BOM並非必須的,由於BOM用來標記多字節編碼文件的編碼類型和字節順序(big-endian或little- endian)。

BOMs 文件頭:

   00 00 FE FF    = UTF-32, big-endian

   FF FE 00 00    = UTF-32, little-endian

   EF BB BF       = UTF-8,

   FE FF          = UTF-16, big-endian

   FF FE          = UTF-16, little-endian

注:jodconverter  2.2.1不支持docx 、xlsx、ppt、文件轉pdf

相關文章
相關標籤/搜索