一 、背景知识
  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;并没有…