宽字符、多字节、unicode、utf-8、gbk编码转化
今天遇到一个编码的问题,困惑了我很长时间,所以就简要的的了解了一下常用的编码类型。
我们最常见的是assic编码,它是一种单字节编码,对多容纳256个字符。
我们在编程的时候经常遇到unicode,unicode是一种宽字节编码,能够很好的融合世界各个国家的字符,具有国际通用性,所谓宽字符其实使用两个字节来表示一个符号。
而utf8是一种多字节编码,一个字符所占用的字节数不确定,是对unicode的精简版本,也用具有世界通用性。Gbk也是一种双字节编码,其实就是对中文简体的一种编码,不具有世界通用性。其他的如韩文、日文都类似这种编码。
我遇到的编码的问题是这样的:
在cocos2dx项目中使用了CCEditBox,通过其函数getText()获取其中的文本,该字符串是windows的路径,但是路径中有中文。根据该路径调用windows API遍历该路径下的所有文件,结果找不到相关路径。我在程序中查看路径有乱码的情况,后来我将文本转化位GBK编码格式就正常了。
原因是这样的cocos2dx是按照utf8编码,他要走向世界,必须具有世界通用性,这也是它选择utf8的原因之一吧。所以getText()函数返回的是utf8编码的字符串,而windows API(中文版)用的是GBK编码格式,所以我们要转换一下格式,也就是将文本从utf8格式转换为GBK编码格式。Windows提供两个API可以完成这种转换。
int MultiByteToWideChar(
UINT CodePage, // code page,使用CP_ACP代码页就实现了ANSI与Unicode之间的转换,使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换
DWORD dwFlags, // character-type options,一般为设0
LPCSTR lpMultiByteStr, // string to map,指向一个多字节字符串
int cbMultiByte, // number of bytes in string,多字节字符串的长度(字节数,当以0结尾的时候,也可以设为-1)
LPWSTR lpWideCharStr, // wide-character buffer,存放转换后的宽字符串缓冲区
int cchWideChar // size of buffer,宽字符串缓冲区的最大长度(字符数)
)
int WideCharToMultiByte(
UINT CodePage, // code page,使用CP_ACP代码页就实现了ANSI与Unicode之间的转换,使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换
DWORD dwFlags, // performance and mapping flags,一般为设0
LPCWSTR lpWideCharStr, // wide-character string,指向一个宽字符串
int cchWideChar, // number of chars in string,宽字符串的长度(字符数)
LPSTR lpMultiByteStr, // buffer for new string,存放转换后的多字节字符串缓冲区
int cbMultiByte, // size of buffer,多字节字符串缓冲区的最大长度(字节数)
LPCSTR lpDefaultChar, // default for unmappable chars,转换失败的字符所显示的字符串,一般设为NULL
LPBOOL lpUsedDefaultChar // set when default char used,如果有字符转换失败,则为TRUE,一般设为NULL
);
宽字符、多字节、unicode、utf-8、gbk编码转化的更多相关文章
- C++中宽字符类型(wchar_t)的编码
转载自: http://www.ituring.com.cn/article/111027 问题的起因是和一个朋友讨论不同编码的转换问题,说到了wchar_t的类型,朋友的看法是,wchar_t的编码 ...
- 宽字符与Unicode (c语言 汉语字符串长度)
在C语言中,我们使用char来定义字符,占用一个字节,最多只能表示128个字符,也就是ASCII码中的字符.计算机起源于美国,char 可以表示所有的英文字符,在以英语为母语的国家完全没有问题. 但是 ...
- unicode 和utf-8,GBK编码
说到编码,得先从ASCII编码讲起.ASCII编码是由美国人发明,美国的字符不超过255个,所以ASCII编码使用了8bit 即一个字节来存储字符.由于汉字的数量远超255个,所以中国自己发明了一个G ...
- 通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- VC++中多字节字符集和Unicode之间的互换
在Visual C++.NET中,默认的字符集是Unicode,这和Windows默认的字符集是一致的,不过在老的VC6.0等工程中,默认的字符集形式是多字节字符集(MBCS:Multi-Byte C ...
- 汉字编码(【Unicode】 【UTF-8】 【Unicode与UTF-8之间的转换】 【汉字 Unicode 编码范围】【中文标点Unicode码】【GBK编码】【批量获取汉字UNICODE码】)
Unicode与UTF-8互转(C语言实现):http://blog.csdn.net/tge7618291/article/details/7599902 汉字 Unicode 编码范围:http: ...
- 关于MultiByteToWideChar与WideCharToMultiByte代码测试(宽字符与多字节字符的转换)以及字符串的转换代码测试
#pragma once #include <stdio.h> //getchar() #include <tchar.h> #include <stdlib.h> ...
- 宽字符wchar_t和窄字符char——putwchar、wprintf
宽字符wchar_t 与 窄字符char 先说下窄字符char,这个大部分读者应该很清楚,char类型的变量占一个字节(byte)(也就是8个bit(比特)),能表示256个字符,那char的范围有两 ...
- 趣谈unicode,ansi,utf-8,unicode big endian这些编码有什么区别
从头讲讲编码的故事.那么就让我们找个草堆坐下,先抽口烟,看看夜晚天空上的银河,然后想一想要从哪里开始讲起.嗯,也许这样开始比较好…… 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同 ...
随机推荐
- np.ones(N)/N的作用
在python中导入numpy包 N=5 weights = np.ones(N)/N //这里就相当于创建了一个数组,且为5个1/5的数组 print "weights&quo ...
- flask第二十三篇——模板【5】过滤器
请关注微信公众号:自动化测试实战 过滤器——format格式化 flaskDemo.py # coding: utf-8 from flask import Flask, render_templat ...
- Android开发入门
教我徒弟Android开发入门(一) 教我徒弟Android开发入门(二) 教我徒弟Android开发入门(三) 出处:http://www.cnblogs.com/kexing/tag/Androi ...
- Spring Boot 入门之消息中间件篇(五)
原文地址:Spring Boot 入门之消息中间件篇(五) 博客地址:http://www.extlight.com 一.前言 在消息中间件中有 2 个重要的概念:消息代理和目的地.当消息发送者发送消 ...
- docker基于Dockerfile命令创建支持ssh服务的镜像
首先,创建一个sshd_centos工作目录: [root@localhost ~]# mkdir sshd_centos [root@localhost ~]# cd sshd_centos [ro ...
- 【nodeJS】webstorm中设置nodej智能提示
- Python 定期检查Build_setting的编译情况
#!/usr/bin/python #_*_ coding:utf-8 _*_ import time from email.MIMEText import MIMEText from email.M ...
- emacs之切换h/cpp配置
emacsConfig/switch-file-setting.el (defun switch-c () (global-set-key (kbd "<C-return>&qu ...
- Java 将指定字符串连接到此字符串的结尾 concat()
Java 手册 concat public String concat(String str) 将指定字符串连接到此字符串的结尾. 如果参数字符串的长度为 0,则返回此 String 对象.否则,创建 ...
- MySQL 多表关联更新及删除
目录: <MySQL中的两种临时表> <MySQL 多表关联更新及删除> <mysql查询优化之三:查询优化器提示(hint)> 一. 多表关联更新 问题 ...