日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字符在utf-8,gbk,gb2312,iso8859-1下的编码实验

發布時間:2025/5/22 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符在utf-8,gbk,gb2312,iso8859-1下的编码实验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一直以來對編碼并不是太理解,所以用java做了個實驗,感覺清楚了點:
下面這個代碼的功能是,獲取某個字符或漢字在utf-8,gbk,gb2312,iso8859-1等下的十六進制,八進制,十進制,二進制的表示(當然,只有二進制才是其在計算機中的真真表示.)
import java.io.UnsupportedEncodingException;

public class CharEncode {
??/**
????* @param str
????*????????????????????????字符
????* @param charsetName
????*????????????????????????編碼
????* @param debug
????*????????????????????????是否調試
????* @throws UnsupportedEncodingException
????*/

??public static void displayEncode(String str, String charsetName,
??????boolean debug) throws UnsupportedEncodingException {
????System.out.println("----------------------------------");
????byte[] bytes = str.getBytes(charsetName);
????int bytes_length = bytes.length;

????System.out.println("字符:" + str + "\t編碼:" + charsetName + "\t共占用"
????????+ bytes_length + "bytes(字節)," + bytes_length * 8
????????+ "bit(位)\t每個字節的情況如下:");
????for (int i = 0; i < bytes_length; i++) {

??????System.out.print("bytes[" + i + "]的十進制為:" + bytes[i]);// 獲取byte字節

??????Integer int_byte = (int) bytes[i];// 強制轉化為int,應為bytes只占8bit,而int占32bit所以個人認為萬無一失.

??????String binaryString = Integer.toBinaryString(int_byte);// 獲取整數的2進制的String表示方式
??????String hexString = Integer.toHexString(int_byte);// 獲取整數的16進制的String表示方式
??????String octalString = Integer.toOctalString(int_byte);// 獲取整數的16進制的String表示方式
??????if (debug) {
????????System.out.print("\t對應的十進制為:" + int_byte);
????????System.out.print("\t對應整數的二進制為:" + binaryString);
????????System.out.print("\t對應整數的八進制為:" + octalString);
????????System.out.print("\t對應整數的十六進制為:" + hexString);
??????}

??????/** **八進制格式顯示* */
??????int octalString_length = octalString.length();
??????System.out.print("\t八進制為:"
??????????+ octalString.substring(octalString_length - 2,
??????????????octalString_length));
??????/** **十六進制格式顯示* */
??????int hexString_length = hexString.length();
??????System.out.print("\t十六進制為:"
??????????+ hexString.substring(hexString_length - 2,
??????????????hexString_length));

??????/** **為了方便閱讀,將二進制以每4位一組的格式顯示* */

??????// 不足8位的,在前段加"0"補齊
??????while (binaryString.length() < 8) {
????????binaryString = "0" + binaryString;
??????}
??????int binaryString_length = binaryString.length();

??????String first = binaryString.substring(binaryString_length - 8,
??????????binaryString_length - 4);// 取前4位
??????String second = binaryString.substring(binaryString_length - 4,
??????????binaryString_length);// 取后4位

??????System.out.println("\t二進制為:" + first + " " + second);

????}
????System.out.println();
??}

??public static void main(String[] args) throws UnsupportedEncodingException {

????// 通過UltraEdit知道: 漢字"我"在gbk編碼下的十六進制是"ced2";

????boolean debug = false;
????String str = "";
????String utf_8 = "utf-8";
????String gbk = "gbk";
????String gb2312 = "gb2312";
????String iso8859_1 = "iso8859-1";

????str = "我";
????System.out.println("*****************" + str + "*******************\n");
????displayEncode(str, utf_8, debug);
????displayEncode(str, gbk, debug);
????displayEncode(str, gb2312, debug);
????displayEncode(str, iso8859_1, debug);

????str = "A";
????System.out.println("*****************" + str + "*******************\n");
????displayEncode(str, utf_8, debug);
????displayEncode(str, gbk, debug);
????displayEncode(str, gb2312, debug);
????displayEncode(str, iso8859_1, debug);

????str = "1";
????System.out.println("*****************" + str + "*******************\n");
????displayEncode(str, utf_8, debug);

??}
}

實驗結果如下:
*****************我*******************

----------------------------------
字符:我??? 編碼:utf-8??? 共占用3bytes(字節),24bit(位)??? 每個字節的情況如下:
bytes[0]的十進制為:-26?? ?? 八進制為:46??? 十六進制為:e6??? 二進制為:1110 0110
bytes[1]的十進制為:-120??? 八進制為:10??? 十六進制為:88??? 二進制為:1000 1000
bytes[2]的十進制為:-111??? 八進制為:21??? 十六進制為:91??? 二進制為:1001 0001

----------------------------------
字符:我??? 編碼:gbk??? 共占用2bytes(字節),16bit(位)??? 每個字節的情況如下:
bytes[0]的十進制為:-50??? 八進制為:16??? 十六進制為:ce??? 二進制為:1100 1110
bytes[1]的十進制為:-46??? 八進制為:22??? 十六進制為:d2??? 二進制為:1101 0010

----------------------------------
字符:我??? 編碼:gb2312??? 共占用2bytes(字節),16bit(位)??? 每個字節的情況如下:
bytes[0]的十進制為:-50??? 八進制為:16??? 十六進制為:ce??? 二進制為:1100 1110
bytes[1]的十進制為:-46??? 八進制為:22??? 十六進制為:d2??? 二進制為:1101 0010

----------------------------------
字符:我??? 編碼:iso8859-1??? 共占用1bytes(字節),8bit(位)??? 每個字節的情況如下:
bytes[0]的十進制為:63??? 八進制為:77??? 十六進制為:3f??? 二進制為:0011 1111? (查ASSCII碼表可得"?",常見的亂碼,呵呵,但為什么先取得是這個二進制呢??????)

*****************A*******************

----------------------------------
字符:A??? 編碼:utf-8??? 共占用1bytes(字節),8bit(位)??? 每個字節的情況如下:
bytes[0]的十進制為:65??? 八進制為:01??? 十六進制為:41??? 二進制為:0100 0001

----------------------------------
字符:A??? 編碼:gbk??? 共占用1bytes(字節),8bit(位)??? 每個字節的情況如下:
bytes[0]的十進制為:65??? 八進制為:01??? 十六進制為:41??? 二進制為:0100 0001

----------------------------------
字符:A??? 編碼:gb2312??? 共占用1bytes(字節),8bit(位)??? 每個字節的情況如下:
bytes[0]的十進制為:65??? 八進制為:01??? 十六進制為:41??? 二進制為:0100 0001

----------------------------------
字符:A??? 編碼:iso8859-1??? 共占用1bytes(字節),8bit(位)??? 每個字節的情況如下:
bytes[0]的十進制為:65??? 八進制為:01??? 十六進制為:41??? 二進制為:0100 0001

*****************1*******************

----------------------------------
字符:1??? 編碼:utf-8??? 共占用1bytes(字節),8bit(位)??? 每個字節的情況如下:
bytes[0]的十進制為:49??? 八進制為:61??? 十六進制為:31??? 二進制為:0011 0001


從中可以看出漢字在utf-8編碼下,占用3個字節,GBK,gb2312占用2個字節,用iso8859-1只能取出一個字節(造成亂碼的原因之一)
另外getBytes(charsetName);方法很強勁啊,回頭想看看源代碼,呵呵

轉載于:https://blog.51cto.com/sunfish/142577

總結

以上是生活随笔為你收集整理的字符在utf-8,gbk,gb2312,iso8859-1下的编码实验的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。