Ansi、Unicode、UTF8字符串之间的转换和写入文本文件

转载请注明出处http://www.cppblog.com/greatws/archive/2008/08/31/60546.html

最近有人问我关于这个的问题,就此写一篇blog

Ansi字符串我们最熟悉,英文占一个字节,汉字2个字节,以一个\0结尾,常用于txt文本文件
Unicode字符串,每个字符(汉字、英文字母)都占2个字节,以2个连续的\0结尾,NT操作系统内核用的是这种字符串,常被定义为typedef unsigned short wchar_t;所以我们有时常会见到什么char*无法转换为unsigned short*之类的错误,其实就是unicode
UTF8是Unicode一种压缩形式,英文A在unicode中表示为0x0041,老外觉得这种存储方式太浪费,因为浪费了50%的空间,于是就把英文压缩成1个字节,成了utf8编码,但是汉字在utf8中占3个字节,显然用做中文不如ansi合算,这就是中国的网页用作ansi编码而老外的网页常用utf8的原因。
UTF8在还游戏里运用的很广泛,比如WOW的lua脚本等

下面来说一下转换,主要用代码来说明吧
写文件我用了CFile类,其实用FILE*之类的也是一样,写文件和字符串什么类别没有关系,硬件只关心数据和长度

Ansi转Unicode
介绍2种方法


void CConvertDlg::OnBnClickedButtonAnsiToUnicode()
{
    
// 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';
    
//unicode版的MessageBox API
    ::MessageBoxW(GetSafeHwnd(), wszString, wszString, MB_OK);

    
//接下来写入文本
    
//写文本文件,头2个字节0xfeff,低位0xff写在前
    CFile cFile;
    cFile.Open(_T(
"1.txt"), CFile::modeWrite | CFile::modeCreate);
    
//文件开头
    cFile.SeekToBegin();
    cFile.Write(
"\xff\xfe"2);
    
//写入内容
    cFile.Write(wszString, wcsLen * sizeof(wchar_t));
    cFile.Flush();
    cFile.Close();
    delete[] wszString;
    wszString 
=NULL;


    
//方法2
    
//设置当前地域信息,不设置的话,使用这种方法,中文不会正确显示
    
//需要#include<locale.h>
    setlocale(LC_CTYPE, "chs"); 
    wchar_t wcsStr[
100];
    
//注意下面是大写S,在unicode中,代表后面是ansi字符串
    
//swprintf是sprintf的unicode版本
    
//格式的前面要加大写L,代表是unicode
    swprintf(wcsStr, L"%S", szAnsi);
    ::MessageBoxW(GetSafeHwnd(), wcsStr, wcsStr, MB_OK);

}


Unicode转Ansi
也是2种方法

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

    
//接下来写入文本
    
//写文本文件,ANSI文件没有BOM
    CFile cFile;
    cFile.Open(_T(
"1.txt"), CFile::modeWrite | CFile::modeCreate);
    
//文件开头
    cFile.SeekToBegin();
    
//写入内容
    cFile.Write(szAnsi, ansiLen * sizeof(char));
    cFile.Flush();
    cFile.Close();
    delete[] szAnsi;
    szAnsi 
=NULL;


    
//方法2
    
//和上面一样有另一种方法
    setlocale(LC_CTYPE, "chs"); 
    
char szStr[100];
    
//注意下面是大写,在ansi中,代表后面是unicode字符串
    
//sprintf
    sprintf(szStr, "%S", wszString);
    ::MessageBoxA(GetSafeHwnd(), szStr, szStr, MB_OK);
}


Unicode转UTF8

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

    
//接下来写入文本
    
//写文本文件,UTF8的BOM是0xbfbbef
    CFile cFile;
    cFile.Open(_T(
"1.txt"), CFile::modeWrite | CFile::modeCreate);
    
//文件开头
    cFile.SeekToBegin();
    
//写BOM,同样低位写在前
    cFile.Write("\xef\xbb\xbf"3);
    
//写入内容
    cFile.Write(szU8, u8Len * sizeof(char));
    cFile.Flush();
    cFile.Close();
    delete[] szU8;
    szU8 
=NULL;

}

UTF8转UNICODE

void CConvertDlg::OnBnClickedButtonU8ToUnicode()
{
    
//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';
    
//unicode版的MessageBox API
    ::MessageBoxW(GetSafeHwnd(), wszString, wszString, MB_OK);

    
//写文本同ansi to unicode
}



Ansi转换utf8和utf8转换Ansi就是上面2个的结合,把unicode作为中间量,进行2次转换即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小女也爱c#(3)--俄罗斯方块练习数组

学完c了&#xff0c;总算是有点收获了&#xff0c;自己写了个俄罗斯方块练习数组&#xff0c;在vc6.0控制台环境下编译通过. makehead.h int Makepanel(char Ary_Panel[][10]);void gotoxy(int x, int y);void BrushsScreen(char ary[][20]);int initializationShape();void Sh…

放松时刻——C#分割字符串

让我们来练习一下字符串的分割~把话倒过来说&#xff1a; private void change_button_Click(object sender, EventArgs e) {var after_text before_TextBox.Text?.Select(x>x.ToString()).ToArray();string result "";for (int i after_text.Length - 1; i &…

cmd 调用JLink.exe 下载程序

1、新建download.jlink脚本 loadbin "D:\Data\ARM\vstestPro\vscode_cubemx_testLED.bin" 0x08000000 r g qc 脚本指明待下载的bin文件位置&#xff0c;指明下载的FLash起始地址。 2、调用jlink 下载bin程序 "C:\Program Files (x86)\SEGGER\JLink_V502c\JL…

黑马程序员---JVM内存组成

java把内存分两种&#xff1a;一种是栈内存&#xff0c;另一种是堆内存1。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配&#xff1b;2。堆内存用来存放由 new创建的对象和数组在函数&#xff08;代码块&#xff09;中定义一个变量时&#xff0c; java就在…

使用WCF建立起Silverlight客户端与服务端的桥梁

最近正在开发一个项目&#xff0c;需要应用到Silverlight以及数据库。在正式开工之前需要掌握将数据从服务端送到客户端的技术&#xff0c;我们采用建立WCF服务的方法。 “做中学”是最好的学习方法&#xff0c;真正实践之后学习者将会有更多的自信和把握&#xff0c;这种感觉将…

[react] <div onClick={handlerClick}>单击</div>和<div onClick={handlerClick(1)}>单击</div>有什么区别?

[react] <div onClick{handlerClick}>单击</div>和<div onClick{handlerClick(1)}>单击</div>有什么区别&#xff1f; 绑定函数有三种方法 1、constructor绑定constructor(props) {super(props);this.handleClick this.handleClick.bind(this); //构…

我的AutoHotkey配置

关键配置&#xff1a; #IfWinActive ^L:: {WinGetClass, active_class, AIfInString, active_class, Afx:400000:8:Send !{Del}elseSend ^L } return #IfWinActive#IfWinActive F4:: {WinGetClass, sClass, Aif (sClass"Chrome_WidgetWin_1" or sClass"MozillaW…

[react] 怎么防止HTML被转义?

[react] 怎么防止HTML被转义&#xff1f; <h1 dangerouslySetInnerHTML{{__html: cc © 2015}}></h1> 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

如何用脚本可靠关闭一个linux服务或进程

一、脚本样例 以quectel的EC20模组关闭ppp拨号服务脚本为例&#xff0c;以下为脚本源码&#xff1a; #!/bin/sh timeout5 killall -15 pppd sleep 1 killall -0 pppd while [ $? -eq 0 ] dotimeoutexpr $timeout - 1if [ $timeout -eq 0 ]thenexit 1fisleep 1killall -0 ppp…

myeclipse8.5安装反编译工具

1.下载最新的jad.exe应用程序 2.下载net.sf.jadclipse_3.3.0.jar&#xff0c;在myeclipse8.5安装的文件夹中创建一个文件夹如jad&#xff0c;在jad文件夹中建立一个文件夹plugin&#xff0c;将下载的net.sf.jadclipse_3.3.0.jar文件放到新建的plugin文件中 3.在myeclipse8.5安…

C++中include 与 include 的区别

<>时先去系统目录中找头文件&#xff0c;如果没有再到当前目录下找。所以像标准的头文件 stdio.h, stdlib.h等都用<>;""则首先到当前目录下找&#xff0c;如果找不到再到系统目录下找。当include自定义的头文件时&#xff0c;优先使用“”。转载于:https…

hdparm命令详解

hdparm命令详解--------------------http://www.linuxsir.org/bbs/showthread.php?p175167hdparm 功能&#xff1a;获取/设置硬盘参数语法&#xff1a;hdparm [参数] [设备名] ..说明(英文不太好&#xff0c;就不在此献丑啦&#xff0c;麻烦英文好的兄弟翻译一下)&#xff1a;…

[react] 请说下react组件更新的机制是什么

[react] 请说下react组件更新的机制是什么 靠事务批量更新 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

vscode 新建python 终端

ctrlshiftp 输入python&#xff0c; 选择Python:创建终端

linux的strace命令(详解)

linux的strace命令(详解)本文详细讲述linux下的strace命令的用法。 strace 命令是一种强大的工具&#xff0c;它能够显示所有由用户空间程序发出的系统调用。 strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息&#xff0c;而且不需要以任何特殊的方式来构建…

UVA-11536 Smallest Sub-Array

题目大意&#xff1a;给出一个有n个数的序列&#xff0c;找出最短的涵盖1~k之间所有整数的连续区间。 题目分析&#xff1a;扫描一遍序列&#xff0c;维护head、tail两个位置。要注意&#xff0c;最短的区间上两端的数一定[1,k]上。 代码如下&#xff1a; # include<iostrea…

[react] 你有用过哪些React的UI库?它们的优缺点分别是什么

[react] 你有用过哪些React的UI库&#xff1f;它们的优缺点分别是什么 antd ui 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

display:inline-block的深入理解

在使用CSS实现表现的时候&#xff0c;会经常接触到display:inline-block这一属性&#xff0c;无论是初接触Web标准还是接触标准已久的朋友&#xff0c;大都会对这一属性感觉很迷惑和模糊。 display:inline-block 引用:将对象呈递为内联对象&#xff0c;但是对象的内容作为块对象…