`
eric_weitm
  • 浏览: 243588 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于各种编码总结

阅读更多
关于各种编码总结

一 、背景知识
  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://jimmee.iteye.com/blog/608984
分享到:
评论

相关推荐

    各种网络编码的总结

    各种网络编码的优点,缺点和应用的总结。网络编码包括erasure code、喷泉码、随机线性网络编码和BATS码。

    天堂游戏的各种编码器

    总结而言,"天堂游戏的各种编码器"涵盖了游戏开发和优化中的核心环节。掌握编码器的使用不仅可以提升游戏性能,还能增强玩家的互动体验。无论你是游戏开发者还是普通玩家,深入学习和分享编码器知识都将对你的游戏之...

    C++各种编码转换 Unicode UTF8

    ### 总结 以上四个部分分别详细解释了C++中常见字符编码之间的转换方法,包括多字节编码到UTF-8、UTF-8到多字节编码、多字节编码到Unicode以及Unicode到多字节编码的转换。这些转换过程对于处理不同系统或程序间的...

    java编码总结1

    【标题】:“Java编码总结1”主要涉及到Java编程语言中的编码问题,这在软件开发中是至关重要的。编码问题往往会导致程序出现难以预料的错误,尤其是处理多国语言或者特殊字符时。Java作为广泛使用的跨平台语言,其...

    tomcat字符编码总结

    ### Tomcat字符编码总结 #### 一、引言 在Web开发中,字符编码问题一直是让人头疼的问题之一,尤其是在处理中文等多字节字符时。本文将深入探讨Tomcat环境中字符编码的相关知识点,并通过实际案例分析如何有效解决...

    Java中编码总结.pdf

    UTF-8是一种可变长度的字符编码方式,它可以使用一个到四个字节表示一个字符,适合各种字符集,并被广泛使用于网络传输。UTF-16使用两个或四个字节表示一个字符,是Java内部处理字符的标准方式。UTF-32固定使用四个...

    信息论与编码期末复习小总结

    此外,还需学习各种编码方法以及它们在通信系统中的应用,包括信源编码技术如哈夫曼编码、算术编码,以及信道编码技术如里德-所罗门编码、卷积编码等。 总之,本复习小结针对信息论与编码课程的期末复习,涵盖了...

    磁编码器的误差偏差分析总结

    磁编码器是一种重要的位置和速度检测装置,广泛应用于各种机械设备中。其主要原理是通过检测永磁体旋转产生的磁场变化来确定角度位置。本文将详细分析磁编码器的角度误差产生的原因,并探讨减小这些误差的方法。 6-...

    关于 字符编码的 转换 知识

    ### 关于字符编码的转换知识 #### 一、引言 字符编码是在计算机科学领域内一个重要的基础概念,它涉及到如何在计算机系统中存储、处理和传输文本信息。随着信息技术的发展,不同地区和文化背景下的用户对字符的...

    编码电子锁设计总结报告

    这些芯片可以组合成各种逻辑电路,例如清零和复位电路。NE555定时器则是一个多功能集成电路,可以配置为振荡器、定时器或者多谐振荡器,其各引脚功能在设计中起到关键作用,如触发输入、阈值输入、复位端等。 **...

    自编码 (Autoencoder) - 自己总结的PPT

    ### 自编码(Autoencoder)概览 #### 一、自编码简介 自编码是一种无监督学习技术,主要用于特征学习和降维。...理解自编码器的基本原理及其各种变体对于利用这些模型解决实际问题是至关重要的。

    数字图像处理编码原理总结

    综上所述,数字图像处理编码原理涉及广泛,包括图像的数字表示、各种编码技术、压缩与解压缩过程以及优化策略。理解并掌握这些概念对于进行图像处理和压缩工作至关重要。提供的“数字图像处理课件”很可能是对此主题...

    G729 编码总结

    G729算法算是一个类,里面细分还有很多具体的东西,在ITU官网上下载的g729包里面,有各种各样的:g729a、g729b、g729c等等,自己实在是不知道该使用哪一个,仔细阅读了文档以后,才发现,g729a是适合自己的。...

    各种类型的电机编码器介绍、分类、工作原理以及如何测速

    电机编码器知识点总结 编码器是一种检测机械运动的速度、位置、角度、距离或计数的传感器,具有分辨率高、精度高、结构简单、体积小、使用可靠、易于维护、性价比高等优点。以下是编码器的详细知识点总结: 一、...

    C#获取网页编码—总结.pdf

    【C#获取网页编码】是编程中常见的任务之一,尤其对于网络爬虫或者数据分析来说,正确识别和处理网页编码至关重要。...通过C#提供的API,我们可以方便地实现对各种网页编码的识别和处理,确保数据的完整性和正确性。

    xindao.rar_MATLAB信道编码_xindao_信道编码_包含信道_各种信道编码

    总结起来,这个压缩包提供了一个学习和实践信道编码的MATLAB环境,对于理解通信系统中的错误检测和纠正机制,以及掌握各种信道编码技术具有很高的价值。通过阅读和运行提供的代码,用户不仅可以深化理论知识,还能...

    unicode编码总结

    Unicode是一种国际标准的字符编码体系,旨在为全球各种语言提供一个统一的字符集,确保每个字符都有一个唯一的编码。它的核心理念是消除由于不同编码系统导致的文本处理问题,使得数据交换和处理更为便捷。Unicode...

Global site tag (gtag.js) - Google Analytics