常見電腦字符編碼總結

一 、背景知識
? 1、計算機中所有的數據都用01串來表示,至于一串01到底代表什么是由軟件來設定的。
??? 比如:01111101111101010111110111110101??? 可以理解為一條指令,也可以理解為4個字節的char字符,具體是什么要看這個數據是在代碼段還是數據段。
? 2、字符是人看到的顯示效果(實際上人看到的是字符對應glyph渲染到屏幕上的效果)
? 3、字符有內部的存儲格式(如'中' 在內存中存為 d6d0(gb2312編碼)),這種編碼叫內碼,本質上是將人理解的字符,映射為二進制01串
? 4、字符需要在系統間交換,這時同樣是'中'在簡體中文版OS和繁體中文版OS中內部表示的格式不同,為了進行數據交換,需要能夠標記一個字符,這種編碼叫交換碼,典型的如 unicode、CNS 11643、CCCII
? 5、windows NT一個字符顯示的過程:讀入內碼---轉為unicode(wide char)---找到字體中對應的字模(glyph)---將此glyph(位圖)寫到顯存---調用顯卡刷到顯示器上

二、基本概念
? 1、計算機一開始是在英語國家中產生的,所以計算機的系統一開始都會做一件事:對拉丁字母進行編碼,加上一些控制符號、數學符號等,這便形成了ASCII編碼。
? 2、像英語這樣的拼音文字很容易編碼,因為所有的詞是由26個字母組合而成的,只要編碼26個字母,就可以輸入所有的單詞。但是像中文這樣的象形文字,則只能針對每個字分別進行編碼(因為每個字的字形都不一樣),這樣舊有的編碼是沒法滿足中國人的要求的(你總不能要求只有懂英語的人才能用電腦吧!), 所以老一代的中國程序員就要為中文進行編碼,其中典型的代表是gb2312(簡體)、big5(繁體),所謂的編碼就是確定中文的每個字在內存中對應的01串是什么,比如'國'在內存中用 b9fa(gb2312編碼)表示。
? 3、因為每個國家的文字是不同的,編碼的方式也是不同的,比如b9fa在大陸代表 '國', 在日本就代表特定的日語字符了,那么怎么樣進行信息交換呢?比如我在中國寫了一份源代碼,現在要拿到日本編譯,那么不好意思,編譯不了,因為這里的語義已經改變了。為了能夠進行信息的交換,最簡單的辦法就是為全世界所有的語言的所有的字符都指定一個唯一的編碼,這個就是unicode編碼
? 4、unicode是統一標記,但是unicode有很多種內部存儲的格式,比如unicode為4e2d的字符在內存中可以用3、4或5個字節來表示,這種內部存儲的表示形式叫內碼,典型的實現有utf-8(unix標準)、utf-16(windows標準)、utf-32等
? 5、在簡體中文windows下使用文本編輯器創建的文本文件,使用的編碼方式是gb2312,即編碼方式是根據locale確定的默認的編碼方式。如果需要和類unix系統下的人進行協作開發時就要注意將編碼方式改為utf-8

三、編碼轉換
? 2種內碼進行轉換,需要有個媒介------unicode,一個轉換編碼的例子:(windows平臺) uft8(multibyte)------unicode(wideChar)-----gb2312(multibyte)
int UTF8ToGB(const char* str,char *out)
{
? WCHAR *strSrc;
? TCHAR *szRes;
? int len;

? //獲得臨時變量的大小
? // 后4個參數是輸入的指針,長度,輸出的指針,長度,這里第4個參數是-1,返回unicode字符數
? int i = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
? strSrc = new WCHAR[i+1];// unicode 字符數組
? MultiByteToWideChar(CP_UTF8, 0, str, -1, strSrc, i);

? //獲得臨時變量的大小
? i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
? szRes = new TCHAR[i+1];// 內碼字符的長度
? WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);

? len = (i+1)*sizeof(CHAR);
? memcpy(out,szRes,len);
? out[len+1] ='\0';

? delete []strSrc;
? delete []szRes;

? return len;
}

四、編程語言的支持
1、java? java內置對unicode的支持,即 new String(...) 時,使用的是unicode編碼格式,所有字符串的操作也是針對unicode,要返回指定編碼的字節數組使用getBytes
例子:

2、c、c++
char VS wchar? string VS wstring

例子: vc2005測試
// testString.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <cstring>
#include <iostream>
#include <string>
#include <locale>

int main(int argc, char* argv[])
{
? const char text[] = "中\u534e人民共和國,龢籦" ;??????????????????? // 這個里面存的是字符串的gb2312內碼,但是可以用\u(unicode)來指定字符
? const wchar_t wtext[] = L"中\u534e人民共和國,龢籦" ;?????????????? // 這個里面存的是unicode

? std::string s1("中\u534e人民共和國,龢籦" );
? std::wstring s2(L"中\u534e人民共和國,龢籦");

? std::cout << "sizeof(char)??? : " << sizeof(char) << std::endl ;
? std::cout << "text??????????? : " << text << std::endl ;
? std::cout << "sizeof(text)??? : " << sizeof(text) << std::endl ; // 算的是字節的數量
? std::cout << "strlen(text)??? : " << strlen(text) << std::endl ;

? std::cout << "text(binary)??? :" ;

? for(size_t i = 0, iMax = strlen(text); i < iMax; ++i)
? {
??? std::cout << " " <<std::hex<< static_cast<unsigned int>(static_cast<unsigned char>(text[i])) ;
? }

? std::cout << std::endl << std::endl ;

? std::cout << "sizeof(wchar_t) : " << sizeof(wchar_t) << std::endl ;
? std::cout << "wtext?????????? : " << wtext << std::endl ;
? std::cout << "wtext?????????? : UNABLE TO CONVERT NATIVELY." << std::endl ;
? std::cout << "sizeof(wtext)?? : " << sizeof(wtext) << std::endl ;
? std::cout << "wcslen(wtext)?? : " << wcslen(wtext) << std::endl ;??????????????????? // 這個函數可以正確的返回字符的個數

? std::cout << "wtext(binary)?? :" ;

? for(size_t i = 0, iMax = wcslen(wtext); i < iMax; ++i)
? {
??? std::cout << " " <<std::hex<< static_cast<unsigned int>(static_cast<unsigned short>(wtext[i])) ;
? }

? std::cout << std::endl << std::endl ;

? std::cout << "sizeof(s1) : " << s1.length() << std::endl ;
? std::cout << "s1?????????? : " << s1 << std::endl ;

? std::cout << "s1(binary)?? :" ;
? const char *temp = s1.c_str();

? for(size_t i = 0 ; i < s1.length(); ++i)
? {
??? std::cout << " " <<std::hex<< static_cast<unsigned int>(static_cast<unsigned short>(temp[i])) ;// 二進制的數據與char的類似,只是每個的前面都加上了ff
? }

std::cout << std::endl << std::endl ;
std::locale loc( "chs" );
std::wcout.imbue( loc ); // 設定本地的編碼
std::wcout << L"中國" << std::endl;

? std::wcout << "sizeof(s2) : " << s2.length() << std::endl ;
? std::wcout << "s2?????????? : " << s2 << std::endl ;

? std::wcout << "s2(binary)?? :" ;
? const wchar_t *temp1 = s2.c_str();

? for(size_t i = 0 ; i < s2.length(); ++i)
? {
??? std::wcout << " " <<std::hex<< static_cast<unsigned int>(static_cast<unsigned short>(temp1[i])) ;// 這個和上面的unicode的數據是一致的
? }
? return 0;
}

輸出:
sizeof(char)??? : 1
text??????????? : 中華人民共和國,龢籦
sizeof(text)??? : 21
strlen(text)??? : 20
text(binary)??? : d6 d0 bb aa c8 cb c3 f1 b9 b2 ba cd b9 fa a3 ac fd 98 bb 62

sizeof(wchar_t) : 2
wtext?????????? : 0013FF1C
wtext?????????? : UNABLE TO CONVERT NATIVELY.
sizeof(wtext)?? : 16
wcslen(wtext)?? : a
wtext(binary)?? : 4e2d 534e 4eba 6c11 5171 548c 56fd ff0c 9fa2 7c66

sizeof(s1) : 14
s1?????????? : 中華人民共和國,龢籦
s1(binary)?? : ffd6 ffd0 ffbb ffaa ffc8 ffcb ffc3 fff1 ffb9 ffb2 ffba ffcd ffb9
fffa ffa3 ffac fffd ff98 ffbb 62

中國
sizeof(s2) : 10
s2?????????? : 中華人民共和國,龢籦
s2(binary)?? : 4,e2d 5,34e 4,eba 6,c11 5,171 5,48c 5,6fd f,f0c 9,fa2 7,c66

五 其他
Unicode編碼表到GB2312編碼表映射表

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451460.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451460.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jsp+easyui+DataGrid 例子

轉自:https://blog.csdn.net/l3922768721/article/details/51597977 導入js和css <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <% taglib uri"http://java.sun.com/jsp/jstl/core"…

@Pointcut的用法

Pointcut 是指那些方法需要被執行"AOP",是由"Pointcut Expression"來描述的.Pointcut可以有下列方式來定義或者通過&& || 和!的方式進行組合. args()args()execution()this()target()target()within()within()annotation其中execution 是用的最多的…

restful風格使用小例

1. 頁面傳參數寫法&#xff1a; http://write.blog.csdn.net/ 參數1 / 參數2 / 參數N restful風格是把參數 直接拼在 / 后面&#xff0c;而不是URL地址重寫方式。 2. 后臺接收用法&#xff1a;

Mac 10.12徹底關閉Dashboard

1、打開【系統偏好設置】。 2、點擊進入【Mission Control】。 3、中間有一項【Dashboard】&#xff0c;點擊它右邊的下拉菜單&#xff0c;選擇【關閉】&#xff0c;即可。 轉載于:https://www.cnblogs.com/EasonJim/p/9547489.html

BHO插件操作IE瀏覽器,js調用C#方法

BHO是IE瀏覽器的擴展程序&#xff0c;全名Browser Helper Object&#xff0c;文件格式為DLL文件。可對IE瀏覽器的界面和訪問內容進行修改操作。BHO只適用于IE瀏覽器&#xff0c;對其他任何瀏覽器都沒有作用。&#xff08;引用自百度百科>_<&#xff09; 本示例實現的功能…

多線程讀取文件File

Java代碼 import java.io.*; class DownThread extends Thread { //定義字節數組&#xff08;取水的竹筒&#xff09;的長度 private final int BUFF_LEN 32; //定義讀取的起始點 private long start; //定義讀取的結束點 private long end; …

LeetCode-----翻轉二叉樹

題目——翻轉二叉樹 翻轉一棵二叉樹。 示例&#xff1a; 輸入&#xff1a; 4/ \2 7/ \ / \ 1 3 6 9 輸出&#xff1a; 4/ \7 2/ \ / \ 9 6 3 1 備注: 這個問題是受到 Max Howell 的 原問題 啟發的 &#xff1a; 谷歌&#xff1a;我們90&#xff05;的工…

JAVA中字符串比較equals()和equalsIgnoreCase()的區別

1、使用equals( )方法比較兩個字符串是否相等。它具有如下的一般形式&#xff1a; boolean equals(Object str) 這里str是一個用來與調用字符串&#xff08;String&#xff09;對象做比較的字符串&#xff08;String&#xff09;對象。如果兩個字符串具有相同的字符和長度&…

Spring Boot 是什么,有什么用。

見&#xff1a;http://www.csdn.net/article/a/2016-05-12/15838098 maven/Java/web/bootstrap/dataTable/app開發QQ群&#xff1a;566862629。希望更多人一起幫助我學習。 首先&#xff0c;我們來看一下spring boot是什么&#xff0c;它幫助我們解決了哪些問題&#xff1a; …

純html5+css3能寫出什么驚人效果?

在搞清楚這個問題之前,我們得先弄清楚H5和css3有哪些驚人的特性首先我們來看下H5的新特性,canvas標簽,多媒體標簽(audio/video) 離線存儲, 新的表單元素, 新的表單控件 地理定位等等,要說道驚人效果,其中canvas audio video 還有地理定位等就可以夠玩一年 但題目中的一個純字,一…

FPGA數據傳輸模塊設計

摘要 FPGA適合于大量數據處理的應用&#xff0c;廣泛應用于嵌入式系統。本文設計的FPGA模塊需要對GPS、便攜打印機和串口數據進行處理&#xff0c;將詳細介紹如何設計FPGA和不同外設之間的數據傳輸。同時&#xff0c;在RTL編碼中&#xff0c;編寫使綜合與布局布線效果更佳的代碼…

java獲取當前時間戳的方法

獲取當前時間戳 //方法 一 System.currentTimeMillis(); //方法 二 Calendar.getInstance().getTimeInMillis(); //方法 三 new Date().getTime(); 獲取當前時間 SimpleDateFormat df new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設置日期格式 String date df.…

解決Linux 忘記root 密碼的辦法

今天突然遇到一個問題&#xff0c;那別人的 linux 系統發現root 密碼竟然不知道&#xff0c;這就尷尬了。經過一番百度&#xff0c;記錄下 如何修改root 密碼 1&#xff1a;開機linxu 按E 鍵 2&#xff1a;繼續按E 鍵 3:選擇 kernel..... 按E 4&#xff1a;在rhgb quiet 后面加…

tomcat的class加載的優先順序

來源&#xff1a;https://bbs.csdn.net/topics/80459833Tomcat的class加載的優先順序一覽 最先是$JAVA_HOME/jre/lib/ext/下的jar文件。環境變量CLASSPATH中的jar和class文件。\$CATALINA_HOME/common/classes下的class文件。\$CATALINA_HOME/commons/endorsed下的jar文件。\$C…

簡單理解Hadoop(Hadoop是什么、如何工作)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、Hadoop主要的任務部署分為3個部分&#xff0c;分別是&#xff1a;Client機器&#xff0c;主節點和從節點。主節點主要負責Hadoop兩個…

JPA @Id 和 @GeneratedValue 注解詳解

Id&#xff1a; Id 標注用于聲明一個實體類的屬性映射為數據庫的主鍵列。該屬性通常置于屬性聲明語句之前&#xff0c;可與聲明語句同行&#xff0c;也可寫在單獨行上。 Id標注也可置于屬性的getter方法之前。 GeneratedValue&#xff1a; GeneratedValue 用于標注主鍵的生…

Factorials 階乘

Description N的階乘寫作N!表示小于等于N的所有正整數的乘積。階乘會很快的變大&#xff0c;如13!就必須用32位整數類型來存儲&#xff0c;70&#xff01;即使用浮點數也存不下了。你的任務是找到階乘最后面的非零位。舉個例子,5!1*2*3*4*5120所以5!的最后面的非零位是2&#x…

硬件模塊設計思想

硬件模塊設計">模塊設計,顧名思義就是將各個不同的功能做成獨立的模塊。然后將各個模塊組合成不同的產品。 對于一個公司硬件模塊化設計,從設計之初,調試,到樣機及產品生產的過程應該是這樣&#xff1a; 1.     了解產品需求 2.     根據需求,選擇合適的處理…

java中的lastIndexOf( )函數是什么意思

int x a.lastIndexOf(b),表示b字符串在a字符串中最后出現的位置。如 a "abcdabcd";b"d";那么x的值為7.

2 分鐘讀懂大數據框架 Hadoop 和 Spark 的異同

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 談到大數據&#xff0c;相信大家對Hadoop和Apache Spark這兩個名字并不陌生。但我們往往對它們的理解只是提留在字面上&#xff0c;并沒有…