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

Java判斷字節(jié)流是否是 UTF8編碼方法示例

 更新時(shí)間:2023年07月21日 10:54:41   作者:岑吾  
這篇文章主要我大家介紹了Java判斷字節(jié)流是否是 UTF8編碼方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Java 判斷字節(jié)流是否是 UTF8 編碼

遇到本來(lái)設(shè)計(jì)時(shí)使用 GBK 編碼處理的地方,在實(shí)際使用過(guò)程導(dǎo)入了 UTF8 編碼,造成了顯示文本為亂碼的現(xiàn)象,在了解 UTF8,GBK 編碼和 Unicode 標(biāo)準(zhǔn)之后,編寫了 Java 判斷字節(jié)流是否是 UTF8 編碼的程序,如果是 UTF8 編碼,則轉(zhuǎn)換成 GBK 編碼。

編碼的基礎(chǔ)知識(shí)

Unicode 是一種標(biāo)準(zhǔn),GBK 和 UTF8 是具體是編碼格式。Java 的字符都是以 Unicode 進(jìn)行存儲(chǔ)的,占兩或四個(gè)字節(jié)(看版本,且 Unicode 編碼中對(duì)應(yīng)關(guān)系是存在 0x00 的編碼的)。Java 中的 getBytes() 方法是和平臺(tái)(編碼)相關(guān)的,在中文系統(tǒng)中返回的可能是 GBK 或 GBK2312,在英文系統(tǒng)中返回的可能是 ISO-8859-1。

  • Unicode 標(biāo)準(zhǔn):是計(jì)算機(jī)科學(xué)領(lǐng)域里的一項(xiàng)業(yè)界標(biāo)準(zhǔn),包括字符集、編碼方案等,它為每種語(yǔ)言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,以滿足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求。
  • GBK 編碼:漢字內(nèi)碼擴(kuò)展規(guī)范,國(guó)標(biāo),漢字占兩個(gè)字節(jié)。
  • UTF8 編碼:針對(duì) Unicode 的可變長(zhǎng)度字符編碼,用 1 到 6 個(gè)字節(jié)編碼 Unicode 字符,漢字一般占 3 個(gè)字節(jié)。

UTF8 編碼格式

如果 Unicode 字符由 2 個(gè)字節(jié)表示,則編碼成 UTF8 很可能需要 3 個(gè)字節(jié)。而如果 Unicode 字符由 4 個(gè)字節(jié)表示,則編碼成 UTF8 可能需要 6個(gè)字節(jié)。用 4 個(gè)或 6 個(gè)字節(jié)去編碼一個(gè) Unicode 字符可能太多了,但很少會(huì)遇到那樣的 Unicode 字符。

UTF8 編碼規(guī)則:如果只有一個(gè)字節(jié)則其最高二進(jìn)制位為 0,如果是多字節(jié),其第一個(gè)字節(jié)從最高位開始,連續(xù)的二進(jìn)制位值為 1,1 的個(gè)數(shù)決定了其編碼的字節(jié)數(shù),其余各字節(jié)均以 10 開頭。

// Unicode6.1定義范圍:0~10 FFFF
// 20 0000 ~ 3FF FFFF 和 400 0000 ~ 7FFF FFFF 屬于 UCS-4,UTF8 現(xiàn)在已經(jīng)棄用了這部分內(nèi)容
---------------------------------------------------------------------------------
n | Unicode (十六進(jìn)制)    | UTF - 8 (二進(jìn)制)
--+-----------------------+------------------------------------------------------
1 | 0000 0000 - 0000 007F | 0xxxxxxx
2 | 0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx
3 | 0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
4 | 0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
---------------------------------------------------------------------------------
// 以下部分棄用
5 | 0020 0000 - 03FF FFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6 | 0400 0000 - 7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
---------------------------------------------------------------------------------

Java 如何判斷單個(gè)字符編碼是否是 UTF8

假設(shè)當(dāng)前需要判定一個(gè) byte[] 數(shù)組內(nèi)的編碼是否是 UTF8 編碼,這個(gè) byte[] 是 String 通過(guò) getBytes() 方法獲取的,判斷單個(gè)字符的編碼步驟如下:

  • 從 byte[] 數(shù)組中獲取一個(gè) byte 并將它轉(zhuǎn)換成無(wú)符號(hào)類型的 int 變量 value
  • 判斷 value 是否是 ASCII 字符(小于 0x80)
  • 判斷 value 是否是無(wú)效字符(大于 0x80,小于 0xC0,參照 UTF8 編碼規(guī)則)
  • 確認(rèn)該字符編碼的是幾字節(jié) UTF8
  • 確認(rèn)該字符編碼的除第一個(gè)字節(jié)外的字節(jié)是否滿足 10xxxxxx 格式

PS:

Java getBytes() 獲取的是帶符號(hào)的十六進(jìn)制,實(shí)際處理時(shí)需要使用無(wú)符號(hào)十六進(jìn)制。

GBK 和 UTF8 中 ASCII 字符的值是一樣的。

具體程序

將十六進(jìn)制流中的所有編碼按照單個(gè)判定的方式便利一遍,如果有不符合 UTF8 編碼規(guī)則的字符出現(xiàn),則該十六進(jìn)制流就不是 UTF8 編碼格式的字串。

public static int byteToUnsignedInt(byte data) {
    return data & 0xff;
}
public boolean isUTF8(byte[] pBuffer) {
    boolean IsUTF8 = true;
    boolean IsASCII = true;
    int size = pBuffer.length;
    int i = 0;
    while (i < size) {
        int value = byteToUnsignedInt(pBuffer[i]);
        if (value < 0x80) {
            // (10000000): 值小于 0x80 的為 ASCII 字符
            if (i >= size - 1) {
                if (IsASCII) {
                    // 假設(shè)純 ASCII 字符不是 UTF 格式
                    IsUTF8 = false;
                }
                break;
            }
            i++;
        } else if (value < 0xC0) {
            // (11000000): 值介于 0x80 與 0xC0 之間的為無(wú)效 UTF-8 字符
            IsASCII = false;
            IsUTF8 = false;
            break;
        } else if (value < 0xE0) {
            // (11100000): 此范圍內(nèi)為 2 字節(jié) UTF-8 字符
            IsASCII = false;
            if (i >= size - 1) {
                break;
            }
            int value1 = byteToUnsignedInt(pBuffer[i + 1]);
            if ((value1 & (0xC0)) != 0x80) {
                IsUTF8 = false;
                break;
            }
            i += 2;
        } else if (value < 0xF0) {
            IsASCII = false;
            // (11110000): 此范圍內(nèi)為 3 字節(jié) UTF-8 字符
            if (i >= size - 2) {
                break;
            }
            int value1 = byteToUnsignedInt(pBuffer[i + 1]);
            int value2 = byteToUnsignedInt(pBuffer[i + 2]);
            if ((value1 & (0xC0)) != 0x80 || (value2 & (0xC0)) != 0x80) {
                IsUTF8 = false;
                break;
            }
            i += 3;
        }  else if (value < 0xF8) {
            IsASCII = false;
            // (11111000): 此范圍內(nèi)為 4 字節(jié) UTF-8 字符
            if (i >= size - 3) {
                break;
            }
            int value1 = byteToUnsignedInt(pBuffer[i + 1]);
            int value2 = byteToUnsignedInt(pBuffer[i + 2]);
            int value3 = byteToUnsignedInt(pBuffer[i + 3]);
            if ((value1 & (0xC0)) != 0x80
                || (value2 & (0xC0)) != 0x80
                || (value3 & (0xC0)) != 0x80) {
                IsUTF8 = false;
                break;
            }
            i += 3;
        } else {
            IsUTF8 = false;
            IsASCII = false;
            break;
        }
    }
    return IsUTF8;
}

UTF8 編碼轉(zhuǎn) GBK 編碼

// Unicode
String unicodeString = "張三";
// 獲取 UTF8 編碼
byte[] nameUTF8 = unicodeString.getBytes("utf-8");
// UTF8 編碼轉(zhuǎn) str
String str = new String(name, "utf-8");
// 獲取 GBK 編碼
byte[] nameGBK = str.getBytes("gbk");

以上就是Java判斷字節(jié)流是否是 UTF8編碼方法示例的詳細(xì)內(nèi)容,更多關(guān)于Java字節(jié)流UTF8編碼判斷的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java MD5加密(實(shí)例講解)

    Java MD5加密(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇Java MD5加密(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Java中使用HashMap時(shí)指定初始化容量性能解析

    Java中使用HashMap時(shí)指定初始化容量性能解析

    這篇文章主要為大家介紹了Java中使用HashMap時(shí)指定初始化容量性能解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • log4j的使用詳細(xì)解析

    log4j的使用詳細(xì)解析

    最近在整理公司產(chǎn)品的日志輸出規(guī)范,涉及l(fā)og4j的使用介紹,就簡(jiǎn)單整理了一下。需要的朋友可以過(guò)來(lái)參考參考
    2013-08-08
  • java算法實(shí)現(xiàn)紅黑樹完整代碼示例

    java算法實(shí)現(xiàn)紅黑樹完整代碼示例

    這篇文章主要介紹了java算法實(shí)現(xiàn)紅黑樹完整代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java中IO流詳解

    Java中IO流詳解

    這篇文章主要介紹了java中的IO流詳細(xì)解讀,需要的朋友可以參考下
    2017-04-04
  • Java實(shí)戰(zhàn)之用Spring開發(fā)條形碼和驗(yàn)證碼

    Java實(shí)戰(zhàn)之用Spring開發(fā)條形碼和驗(yàn)證碼

    這篇文章主要介紹了Java實(shí)戰(zhàn)之用Spring開發(fā)條形碼和驗(yàn)證碼,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • JavaEE初階教程之Java?IO流讀寫與文件操作實(shí)戰(zhàn)

    JavaEE初階教程之Java?IO流讀寫與文件操作實(shí)戰(zhàn)

    在Java編程中IO流是進(jìn)行文件讀寫操作的重要組成部分,IO流提供了一種靈活、可靠的方式來(lái)處理文件和數(shù)據(jù)流,這篇文章主要介紹了JavaEE初階教程之Java?IO流讀寫與文件操作實(shí)戰(zhàn)的相關(guān)資料,需要的朋友可以參考下
    2025-12-12
  • java字符串的大寫字母右移實(shí)現(xiàn)方法

    java字符串的大寫字母右移實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇java字符串的大寫字母右移實(shí)現(xiàn)方法。小編覺(jué)得聽不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Java Web導(dǎo)出等比例圖片到Excel的實(shí)現(xiàn)過(guò)程

    Java Web導(dǎo)出等比例圖片到Excel的實(shí)現(xiàn)過(guò)程

    我們使用Java導(dǎo)出圖片到Excel,打開成功導(dǎo)出的Excel一看,商品對(duì)應(yīng)的圖片都很規(guī)矩的按照我的設(shè)置鋪滿了整個(gè)單元格,但是,商品圖片卻都變形了,這樣肯定是不行的,于是第一反應(yīng)就是將圖片等比例導(dǎo)出,所以本文本給大家介紹了如何使用Java Web導(dǎo)出等比例圖片到Excel
    2023-11-11
  • SpringBoot如何讀取Resource下的文件

    SpringBoot如何讀取Resource下的文件

    這篇文章主要介紹了SpringBoot如何讀取Resource下的文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04

最新評(píng)論

衡南县| 宣威市| 卫辉市| 富川| 龙泉市| 眉山市| 黔西县| 子长县| 措勤县| 甘孜| 永善县| 隆子县| 清原| 江山市| 通辽市| 玉龙| 玉门市| 潞城市| 志丹县| 清新县| 泉州市| 报价| 福泉市| 宣恩县| 法库县| 永仁县| 伊川县| 隆尧县| 衡山县| 喀喇沁旗| 如东县| 麻阳| 三门峡市| 科技| 招远市| 望都县| 寿光市| 内江市| 塔城市| 罗山县| 东方市|