最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java導出dbf文件生僻漢字處理方式

 更新時間:2021年06月24日 11:31:11   作者:jbgtwang  
這篇文章主要介紹了java導出dbf文件生僻漢字處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

java導出dbf文件生僻漢字處理

java導出數(shù)據(jù)到dbf文件,如果姓名中有生僻漢字,在dbf中看到的很可能是?號。

遇到這種情況需查對GBK的生僻漢字的Unicode表,GBK提及的52個生僻漢字有兩種Unicode。

例如:

䶮(yan 3) \u4ADE就不能在dbf中正常顯示是?

如果換成\uE863則可以(可以打開word的插入->符號->其他符號,在字符代碼中輸入4ADE的到字符插入word,輸入E863的到另一形式插入word,將這兩種形式的字符從word拷貝到Visual Fox Pro的命令窗口可以看到差別,一個變成?一個能正常顯示)。

解決方式:

1.建立52個生僻漢字的unicode映射Map

2.將生僻漢字轉成unicode形式(有可能是將整個姓名轉成unicode)

3.將姓名的unicode形式進行分割(\u)生成數(shù)組(注意兩端的雙引號)

4.遍歷unicode數(shù)組,如果找到生僻漢字的unicode則進行替換

5.將unicode還原成漢字

6.寫入dbf

漢字轉unicode可利用(import com.alibaba.fastjson.JSON) :

    //unicode轉中文
    public static String unicodeToString(String str) {  
        return String.valueOf(JSON.parse(str));
    }    
    //中文字符轉unicode
    public static String stringToUnicode(String s) {  
        return JSON.toJSONString(s, SerializerFeature.BrowserCompatible);
    }

其他說明:

例如:

䶮在mysql中能顯示出來,導出到dbf中時如果選擇 字符集為 GB2312或GBK,導出的 䶮為?。

在Visual Fox Pro 9的命令窗口里輸入的 䶮為?

打開word,插入,輸入字符編碼4DAE得到 䶮,插入到word,復制粘貼到 Visual Fox Pro 9的命令窗口改字顯示 為?

打開word,插入,輸入字符編碼8E63得到 ,有些版本的Word能顯示出來,有些版本的不能顯示,按Alt+X ,插入到word,復制粘貼到 Visual Fox Pro 9的命令窗口改字能顯示 正常

上圖輸入E863無反應

按快捷鍵Alt+x后的效果

java-dbf中文標題亂碼

項目中需要對DBF的文件進行導入處理,上網搜了發(fā)現(xiàn)有java-dbf這個東西。實際應用中踩了不少坑,主要就是中文亂碼的問題。

InputStream in = new FileInputStream("D:\\test.dbf");
        DBFReader reader = new DBFReader(in);
        reader.setCharactersetName("GBK");
        for(int i = 0; i < reader.getFieldCount(); i++){
            DBFField field = reader.getField(i);
            System.out.print(field.getName() + ",");
        }
        System.out.print("\r\n");
        Object[] values;
        while ( (values = reader.nextRecord()) != null ){
            for(Object value : values){
                System.out.print(value.toString() + ",");
            }
            System.out.print("\r\n");
        }

網上寫法千篇一律,大概就是這樣。問題來了DBF中具體數(shù)據(jù)的中文亂碼通過reader.setCharactersetName("GBK")解決了。

但是發(fā)現(xiàn)列名的亂碼還是沒有解決

后來查了一下源碼,發(fā)現(xiàn)了問題所在

public DBFReader(InputStream in, Charset charset, boolean showDeletedRows) {
        try {
            this.showDeletedRows = showDeletedRows;
            this.inputStream = in;
            this.dataInputStream = new DataInputStream(this.inputStream);
            this.header = new DBFHeader();
            this.header.read(this.dataInputStream, charset, showDeletedRows);
            setCharset(this.header.getUsedCharset());
            /* it might be required to leap to the start of records at times */
            int fieldSize = this.header.getFieldDescriptorSize();
            int tableSize = this.header.getTableHeaderSize();
            int t_dataStartIndex = this.header.headerLength - (tableSize + (fieldSize * this.header.fieldArray.length)) - 1;            
            skip(t_dataStartIndex);
            
            this.mapFieldNames = createMapFieldNames(this.header.userFieldArray);
        } catch (IOException e) {
            DBFUtils.close(dataInputStream);
            DBFUtils.close(in);
            throw new DBFException(e.getMessage(), e);
        }
    }

其中header就是我們讀取的列名,列數(shù)所依靠的成員變量,但是這個變量在對象創(chuàng)建的時候就賦值好了。

這就導致了后來即使調用了setCharactersetName也解決不了列名亂碼問題。

所以我們要從根本上解決問題,創(chuàng)建對象的時候直接傳入charset對象。

修改后代碼如下

public static void main(String[] args) throws FileNotFoundException {
        InputStream in = new FileInputStream("D:\\test.dbf");
        Charset charset = Charset.forName("GBK");
        DBFReader reader = new DBFReader(in,charset);
        for(int i = 0; i < reader.getFieldCount(); i++){
            DBFField field = reader.getField(i);
            System.out.print(field.getName() + ",");
        }
        System.out.print("\r\n");
        Object[] values;
        while ( (values = reader.nextRecord()) != null ){
            for(Object value : values){
                System.out.print(value.toString() + ",");
            }
            System.out.print("\r\n");
        }
    }

輸出時候列名就正常了

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • spring-gateway網關聚合swagger實現(xiàn)多個服務接口切換的示例代碼

    spring-gateway網關聚合swagger實現(xiàn)多個服務接口切換的示例代碼

    這篇文章主要介紹了spring-gateway網關聚合swagger實現(xiàn)多個服務接口切換的示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • IDEA 單元測試創(chuàng)建方法詳解(2020.03版本親測)

    IDEA 單元測試創(chuàng)建方法詳解(2020.03版本親測)

    這篇文章主要介紹了IDEA 單元測試創(chuàng)建方法詳解(2020.03版本親測),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot ApplicationEvent之事件發(fā)布與監(jiān)聽機制詳解

    SpringBoot ApplicationEvent之事件發(fā)布與監(jiān)聽機制詳解

    本文將深入探討SpringBoot的事件機制,介紹其核心概念、實現(xiàn)方法及最佳實踐,幫助開發(fā)者構建更加靈活、可維護的應用架構,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Java中的2種集合排序方法介紹

    Java中的2種集合排序方法介紹

    這篇文章主要介紹了Java中的2種集合排序方法介紹,本文直接給出代碼,相關說明請看代碼中的注釋,需要的朋友可以參考下
    2014-10-10
  • Java設計模式之工廠模式案例詳解

    Java設計模式之工廠模式案例詳解

    工廠模式(Factory Pattern)是Java中最常用的設計模式之一。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。本文將通過案例詳細講解一下工廠模式,需要的可以參考一下
    2022-02-02
  • Mybatis的Mapper中的方法為什么不能重載

    Mybatis的Mapper中的方法為什么不能重載

    這篇文章主要介紹了Mybatis的Mapper中的方法為什么不能重載,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • IDEA關于.properties資源文件的編碼調整問題

    IDEA關于.properties資源文件的編碼調整問題

    這篇文章主要介紹了IDEA關于.properties資源文件的編碼調整問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 談談Spring 注入properties文件總結

    談談Spring 注入properties文件總結

    本篇談談Spring 注入properties文件總結,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Spring內置任務調度如何實現(xiàn)添加、取消與重置詳解

    Spring內置任務調度如何實現(xiàn)添加、取消與重置詳解

    任務調度是我們日常開發(fā)中經常會碰到的,下面這篇文章主要給大家介紹了關于Spring內置任務調度如何實現(xiàn)添加、取消與重置的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-10-10
  • 關于在IDEA熱部署插件JRebel使用問題詳解

    關于在IDEA熱部署插件JRebel使用問題詳解

    這篇文章主要介紹了關于在IDEA熱部署插件JRebel使用問題詳解,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12

最新評論

蒙阴县| 哈尔滨市| 成安县| 神池县| 雅安市| 会东县| 阜阳市| 屯留县| 会东县| 萍乡市| 伊川县| 阜康市| 峨眉山市| 黄陵县| 雅安市| 苗栗县| 南岸区| 拜泉县| 加查县| 文成县| 定边县| 慈溪市| 兴业县| 龙江县| 辽阳市| 垣曲县| 五指山市| 承德市| 抚顺市| 杭锦后旗| 巍山| 武隆县| 长治市| 东辽县| 鹤山市| 子洲县| 永昌县| 徐州市| 阿克| 宜都市| 成武县|