C++字符转码

wchar_t* U8ToUnicode(char* szU8)
{
    //UTF8 to Unicode
    //由于中文直接复制过来会成乱码,编译器有时会报错,故采用16进制形式
    //char* szU8 = "abcd1234\xe4\xbd\xa0\xe6\x88\x91\xe4\xbb\x96\x00";
    //预转换,得到所需空间的大小
    int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);
    //分配空间要给‘\0‘留个空间,MultiByteToWideChar不会给‘\0‘空间
    wchar_t* wszString = new wchar_t[wcsLen + 1];
    //转换
    ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen);
    //最后加上‘\0‘
    wszString[wcsLen] = ‘\0‘;
    return wszString;
}

char* UnicodeToU8(wchar_t* szUnicode)
{
    // unicode to UTF8
    //wchar_t* wszString = L"abcd1234你我他";
    //预转换,得到所需空间的大小,这次用的函数和上面名字相反
    int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, szUnicode, wcslen(szUnicode), NULL, 0, NULL, NULL);
    //同上,分配空间要给‘\0‘留个空间
    //UTF8虽然是Unicode的压缩形式,但也是多字节字符串,所以可以以char的形式保存
    char* szU8 = new char[u8Len + 1];
    //转换
    //unicode版对应的strlen是wcslen
    ::WideCharToMultiByte(CP_UTF8, NULL, szUnicode, wcslen(szUnicode), szU8, u8Len, NULL, NULL);
    //最后加上‘\0‘
    szU8[u8Len] = ‘\0‘;
    return szU8;
}

char* UnicodeToAnsi(wchar_t* szUnicode)
{
    // unicode to ansi
    //wchar_t* wszString = L"abcd1234你我他";
    //预转换,得到所需空间的大小,这次用的函数和上面名字相反
    int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, szUnicode, wcslen(szUnicode), NULL, 0, NULL, NULL);
    //同上,分配空间要给‘\0‘留个空间
    char* szAnsi = new char[ansiLen + 1];
    //转换
    //unicode版对应的strlen是wcslen
    ::WideCharToMultiByte(CP_ACP, NULL, szUnicode, wcslen(szUnicode), szAnsi, ansiLen, NULL, NULL);
    //最后加上‘\0‘
    szAnsi[ansiLen] = ‘\0‘;
    return szAnsi;
}

wchar_t* AnsiToUnicode(char* szAnsi)
{
    // ansi to unicode
    //char* szAnsi = "abcd1234你我他";
    //预转换,得到所需空间的大小
    int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);
    //分配空间要给‘\0‘留个空间,MultiByteToWideChar不会给‘\0‘空间
    wchar_t* wszString = new wchar_t[wcsLen + 1];
    //转换
    ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);
    //最后加上‘\0‘
    wszString[wcsLen] = ‘\0‘;
    return wszString;
}
时间: 2024-08-05 12:01:03

C++字符转码的相关文章

C#编程总结(十)字符转码

C#编程总结(十)字符转码 为了适应某种特殊需要,字符需要根据规则进行转码,便于传输.展现以及其他操作等. 看看下面的转码,就知道他的用处了. 1.字符串转码 根据原编码格式与目标编码格式,完成转换.不过可能出现乱码哦.上一章已经介绍过了. 代码: /// <summary> /// 字符串编码转换 /// </summary> /// <param name="srcEncoding">原编码</param> /// <param

标识符和保留字以及字符转义码

标识符保留字 and  del   from nonlocal try as elif golbal not while assert else if  or with break except import pass yield class exec in  print continue finally  is  raise def for lambda return 1.以一个下划线开始的标识符 如_foo,不能使用from module import * 导入 2.前后带有双下划线的标识符

C#字符ASCII码学习经验

很多时候我们需要得到一个英文字符的 ASCII 码,或者一个汉字字符的 Unicode 码,或者从相关的编码查询它是哪一个字符的编码.很多人,尤其是从 VB 程序序转过来学 C# 的人,会报怨 C# 里为什么没有提供现成的函数来做这个事情——因为在 VB 中有 Asc() 函数和 Chr() 函数用于这类转换.但是如果你学过 C,你就会清楚,我们只需要将英文字符型数据强制转换成合适的数值型数据,就可以得到相应的C#字符ASCII码:反之,如果将一个合适的数值型数据强制转换成字符型数据,就可以得到

java 字符转码与反转码

本人最近在做OAF的二次开发,在看别人写的代码时,发现总有类似这样的语句:”\u65e0\u6548\u7684GP\u9879\u76ee\u7f16\u53f7“,这些语句其实是用Java_home中的工具native2ascii.exe转码而成.在显示消息通知时,oracle并不推荐这么做,平时都是在”应用开发员“这个职责下配的消息.下面我就来介绍下如何用native2ascii.exe工具进行转码和反转码的. 1.java 字符转码 打开dos窗口,输入cmd, 并且输入:cd C:\P

关于htmlspecialchars实体字符转码的问题

php对post过来的数据进行实体字符转码,我的页面编码是gb2312,刚开始是这样: $post = htmlspecialchars ( $post); 取到的$post值为空,但是有时候是好的(中文有时会出问题),不是一直这样. 翻了一下php文档, The third argument charset defines character set used in conversion. The default character set is ISO-8859-1. Support for

python学习之路:文件with自动关闭+字符转码

with语句可实现文件的自动关闭功能: 1 import sys 2 ''' 3 with open("yesterday2","r",encoding="utf-8") as f: #自动关闭并释放文件资源 4 for line in f: 5 print(line) 6 ''' 7 with open("yesterday2","r",encoding="utf-8") as f,

python字符转码

字符的编码与转码 demo UTF-8 转GBK python2.7 默认编码ASCII 没有转Unicode 直接转GBK 1 .系统的默认编码是ASCII , 程序的指定编码是UTF-8,在encode的时候会自动的做一次解码的操作decode(),解码的编码是系统的默认编码ASCII. 2. 在使用decode()解码的时候需要说明解码之前的编码.如:decode('UTF-8') unicode 默认可以显示中文,但是在元组中格式不会显示中文. Python3 python中的数据类型默

python之day3(文件操作、字符转码、函数)

文件操作 f=open("yesterday","r",encoding="utf-8")  #以只读模式打开文件 data=f.read()                             #读取所有内容 data2=f.read()                       #读取所有内容 print(data)                          #再次读取所有内容 print("-------------

33 第一个只出现一次的字符+ASCII码

题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置 思路:使用一个hashmap遍历一遍,统计每个字符出现的次数,然后再统计一遍,找到第一个出现一次的元素. 所有的字符有256个,可以开辟一个256的数组,直接使用字符访问就可以了,会自动转换为整数.A是65. ASCII码 class Solution { public: int FirstNotRepeatingChar(string str) { if(str.size()

对于很多人来说,yon的中字符转码是一件很头疼的事情,本佛山网络诵读大赛暨2

RabbiMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多,刚才 谷歌在安卓P版本中已经提供了统一的适配方案,可是在安卓O版本上如何适配呢?本文将详细介绍华为安卓O版本刘海屏适配方案.使用华为提供的刘海屏SDK进 [????7878756]?EXT4-fs?error?(device?mmcblk02):?ex4_mb_佛山网络诵读大赛暨2018全民阅读大会(佛山赛区)开赛啦generae_buddy:742