openoffice将txt文本转pdf中文乱码

原创
2018/05/30 12:03
阅读数 5.6K

问题描述:

   使用openoffice将txt文本转pdf的过程中发现中文乱码。

解决思路及过程:

 1、查看出现乱码的原因

      经查询jodconverter源码发现,只有utf-8编码的文本才不会中文乱码。

 2、怎么样将非utf-8编码文件转换成utf-8文件。

      要转之前首先要判断txt文本本身的编码。经查发现txt文本有一个头。

  判断方法如下

 /**
     * 根据文件路径返回文件编码
     * @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;  
  } 

转换代码如下

 /** 
     * 以指定编码方式写文本文件,存在会覆盖 
     *  
     * @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-8、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

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部