VC中Unicode字符串的处理
c语言中去掉字符串中的重音符号和变音符号的方法

文章主题:C语言中去掉字符串中的重音符号和变音符号的方法在C语言中,处理文本是一个常见的任务。
而在处理文本的过程中,有时会遇到需要去掉字符串中的重音符号和变音符号的情况。
这些符号通常是为了表示特定的发音或语调,但在某些情况下,我们可能希望将字符串中的这些符号去掉,以便更方便地处理和比较文本。
现在,让我们来探讨一下在C语言中去掉字符串中的重音符号和变音符号的方法。
在这篇文章中,我将向你介绍几种不同的方法,以及它们各自的优缺点。
通过本文的阅读,你将能够全面、深入地理解这个主题,并为在实际项目中处理文本时做出更明智的决策。
1. 使用iconv库函数在C语言中,可以使用iconv库函数来进行字符编码的转换。
这些函数可以将字符串从一种字符编码转换为另一种字符编码,其中就包括了去掉重音符号和变音符号的操作。
通过使用iconv库函数,我们可以很方便地实现对字符串中特定字符的转换或去除。
然而,使用iconv库函数也存在一些缺点。
iconv函数的使用方式相对复杂,需要对字符编码有一定的了解才能够正确操作。
iconv库函数是一个比较底层的操作,需要开发者自行处理一些细节,可能会增加代码的复杂性和出错的可能性。
2. 使用strchr和strcpy函数另一种常见的方法是使用C语言标准库中的strchr和strcpy函数。
通过这两个函数的结合,我们可以在字符串中逐个查找需要去除的字符,并将剩余的部分逐个复制到新的字符串中。
这样一来,就能够去掉字符串中的重音符号和变音符号。
与使用iconv库函数相比,这种方法的优点在于简单易懂,不需要对字符编码有深入的了解。
但这种方法的缺点也是显而易见的,即复制大量字符可能会导致性能上的损失,尤其是对于长字符串的处理。
3. 使用正则表达式正则表达式是一种强大的文本匹配工具,可以用来查找和替换字符串中的特定模式。
在C语言中,我们可以使用POSIX标准库中的regex 函数来进行正则表达式的操作。
VC中Ansi、Unicode、UTF8字符串之间的转换和写入文本

//同上,分配空间要给'\0'留个空间
//UTF8虽然是Unicode的压缩形式,但也是多字节字符串,所以可以以char的形式保存
{
// ansi to unicode
char* szAnsi = "abcd1234你我他";
//预转换,得到所需空间的大小
int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);
::MessageBoxW(GetSafeHwnd(), wszString, wszString, MB_OK);
//写文本同ansi to unicode
}
Ansi转换utf8和utf8转换Ansi就是上面2个的结合,把unicode作为中间量,进行2次转换即可
//最后加上'\0'
szAnsi[ansiLen] = '\0';
//Ansi版的MessageBox API
::MessageBoxA(GetSafeHwnd(), szAnsi, szAnsi, MB_OK);
//接下来写入文本
//写文本文件,ANSI文件没有BOM
VC中Ansi、Unicode、UTF8字符串之间的转换和写入文本
Ansi字符串我们最熟悉,英文占一个字节,汉字2个字节,以一个\0结尾,常用于txt文本文件
VC中实现GB2312、BIG5、Unicode编码转换的方法

VC中实现GB2312、BIG5、Unicode编码转换的⽅法本⽂主要以实例形式讨论了VC编译环境下,实现字符串和⽂件编码⽅式转换的⽅法,在linux下请使⽤Strconv来实现。
具体⽅法如下:⼀、⽂件编码格式转换//GB2312 编码⽂件转换成 Unicode:if((file_handle = fopen(filenam,"rb")) != NULL){//从GB2312源⽂件以⼆进制的⽅式读取buffernumread = fread(str_buf_pool,sizeof(char),POOL_BUFF_SIZE,file_handle);fclose(file_handle);//GB2312⽂件buffer转换成UNICODEnLen =MultiByteToWideChar(CP_ACP,0,str_buf_pool,-1,NULL,0);MultiByteToWideChar(CP_ACP,0,str_buf_pool,-1,(LPWSTR)str_unicode_buf_pool,nLen);//组装UNICODE Little Endian编码⽂件⽂件头标⽰符"0xFF 0xFE"//备注:UNICODE Big Endian编码⽂件⽂件头标⽰符"0xFF 0xFE"//Little Endian与Big Endian编码差异此处不详述unicode_little_file_header[0]=0xFF;unicode_little_file_header[1]=0xFE;//存储⽬标⽂件if((file_handle=fopen(filenewname,"wb+")) != NULL){fwrite(unicode_little_file_header,sizeof(char),2,file_handle);numwrite = fwrite(str_unicode_buf_pool,sizeof(LPWSTR),nLen,file_handle);fclose(file_handle);}}⼆、字符串编码格式转换//GB2312 转换成 Unicode:wchar_t* GB2312ToUnicode(const char* szGBString){UINT nCodePage = 936; //GB2312int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0);wchar_t* pBuffer = new wchar_t[nLength+1];MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength);pBuffer[nLength]=0;return pBuffer;}//BIG5 转换成 Unicode:wchar_t* BIG5ToUnicode(const char* szBIG5String){UINT nCodePage = 950; //BIG5int nLength=MultiByteToWideChar(nCodePage,0,szBIG5String,-1,NULL,0);wchar_t* pBuffer = new wchar_t[nLength+1];MultiByteToWideChar(nCodePage,0,szBIG5String,-1,pBuffer,nLength);pBuffer[nLength]=0;return pBuffer;}//Unicode 转换成 GB2312:char* UnicodeToGB2312(const wchar_t* szUnicodeString){UINT nCodePage = 936; //GB2312int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);char* pBuffer=new char[nLength+1];WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);pBuffer[nLength]=0;return pBuffer;}//Unicode 转换成 BIG5:char* UnicodeToBIG5(const wchar_t* szUnicodeString){UINT nCodePage = 950; //BIG5int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);char* pBuffer=new char[nLength+1];WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);pBuffer[nLength]=0;return pBuffer;}//繁体中⽂BIG5 转换成简体中⽂ GB2312char* BIG5ToGB2312(const char* szBIG5String){LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);wchar_t* szUnicodeBuff = BIG5ToUnicode(szBIG5String);char* szGB2312Buff = UnicodeToGB2312(szUnicodeBuff);int nLength = LCMapString(lcid,LCMAP_SIMPLIFIED_CHINESE, szGB2312Buff,-1,NULL,0);char* pBuffer = new char[nLength + 1];LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE,szGB2312Buff,-1,pBuffer,nLength);pBuffer[nLength] = 0;delete[] szUnicodeBuff;delete[] szGB2312Buff;return pBuffer;}//简体中⽂ GB2312 转换成繁体中⽂BIG5char* GB2312ToBIG5(const char* szGBString){LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);int nLength = LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,NULL,0);char* pBuffer=new char[nLength+1];LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,pBuffer,nLength);pBuffer[nLength]=0;wchar_t* pUnicodeBuff = GB2312ToUnicode(pBuffer);char* pBIG5Buff = UnicodeToBIG5(pUnicodeBuff);delete[] pBuffer;delete[] pUnicodeBuff;return pBIG5Buff;}三、API 函数:MultiByteToWideChar参数说明第⼀个参数为代码页, ⽤ GetLocaleInfo 函数获取当前系统的代码页,936: 简体中⽂, 950: 繁体中⽂第⼆个参数为选项,⼀般⽤ 0 就可以了第三个参数为 ANSI 字符串的地址, 这个字符串是第⼀个参数指定的语⾔的 ANSI 字符串 (AnsiString)第四个参数为 ANSI 字符串的长度,如果⽤ -1, 就表⽰是⽤ 0 作为结束符的字符串第五个参数为转化⽣成的 unicode 字符串 (WideString) 的地址, 如果为 NULL, 就是代表计算⽣成的字符串的长度第六个参数为转化⽣成的 unicode 字符串缓存的容量,也就是有多少个UNICODE字符。
VC++中的char wchar_T和TCHAR

大家一起做一个项目,经常发现有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX 函数,这个问题曾经搞的很混乱。
为了统一,有必要把来龙去脉搞清楚。
为了搞清这些函数,就必须理请几种字符类型的写法。
char就不用说了,先说一些wchar_t。
wchar_t是Unicode字符的数据类型,它实际定义在<string.h>里:typedef unsigned short wchar_t;不能使用类似strcpy这样的ANSI C字符串函数来处理wchar_t字符串,必须使用wcs前缀的函数,例如wcscpy。
为了让编译器识别Unicode字符串,必须以在前面加一个“L”,例如:wchar_t *szTest=L"This is a Unicode string.";下面在看看TCHAR。
如果你希望同时为ANSI和Unicode编译的源代码,那就要include TChar.h。
TCHAR是定义在其中的一个宏,它视你是否定义了_UNICODE宏而定义成char 或者wchar_t。
如果你使用了TCHAR,那么就不应该使用ANSI的strXXX函数或者Unicode 的wcsXXX函数了,而必须使用TChar.h中定义的_tcsXXX函数。
另外,为了解决刚才提到带“L”的问题,TChar.h中定义了一个宏:“_TEXT”。
以strcpy函数为例子,总结一下:.如果你想使用ANSI字符串,那么请使用这一套写法:char szString[100];strcpy(szString,"test");.如果你想使用Unicode字符串,那么请使用这一套:wchar_t szString[100];wcscpyszString,L"test");.如果你想通过定义_UNICODE宏,而编译ANSI或者Unicode字符串代码:TCHAR szString[100];_tcscpy(szString,_TEXT("test"));2.字符串及处理之三: 使用TCHAR系列方案使用TCHAR系列方案编写程序TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码。
如何处理代码中的 Unicode 编码问题

如何处理代码中的 Unicode 编码问题在编程中,处理Unicode编码问题是一个非常重要的技能。
Unicode编码是一种用来表示世界上所有语言字符的标准编码方式,它可以避免在不同的编程环境中出现乱码问题。
本文将介绍如何处理代码中的Unicode编码问题,包括Unicode编码的基本知识、在不同编程语言中处理Unicode编码的方法,以及常见的Unicode编码问题及解决方法。
一、Unicode编码的基本知识Unicode编码是一种全球通用的字符编码标准,它可以表示世界上所有的语言字符,包括ASCII字符以及各种语言的特殊字符。
Unicode 编码采用多字节编码方式,每个字符对应一个或多个字节,这样就可以表示更多的字符,避免了以前使用的ASCII编码的限制。
在Unicode编码中,不同的字符对应不同的编码值,这些编码值可以直接用来表示字符,而不需要像ASCII编码一样限制在127个字符范围内。
Unicode编码采用16位或32位的编码方式,可以表示2^16或2^32个字符,这样就可以满足不同语言字符的表示需求。
二、在不同编程语言中处理Unicode编码的方法1. Python中处理Unicode编码Python是一种非常流行的编程语言,它天生支持Unicode编码,在Python中处理Unicode编码非常简单。
在Python 2.x版本中,字符串默认使用ASCII编码,需要在字符串前加上u前缀表示Unicode 编码;而在Python 3.x版本中,默认使用Unicode编码,不需要加前缀表示。
在Python中,可以使用encode()和decode()方法来进行Unicode 编码和解码操作,也可以使用unicode和str类型来表示Unicode字符串和字节串。
在处理文件读写时,可以使用codecs模块来设置文件的编码格式,这样就可以避免文件读写时出现的Unicode编码问题。
2. Java中处理Unicode编码Java是一种非常流行的编程语言,它也天生支持Unicode编码。
用VC++编程实现转换文本文件的字符编码

用 记 事 本 打 开 时 将 会 显 示 乱 码 , 将 设 置 改 为 C iee (R ) hn s P C 就可 正 常显 示 。 由于 U i d nc e是 国 际 通 用 的 宽 字 节 字 符 集 , o 所 以用 U i d n o e编 码 的 文 本 文 件 不 受 此 处 设 置 的影 响 , 都 可 c
件 从 一 种 字 符 编 码转 为 由另 一 种 字 符 编 码 来 存 储 .一 般 使 用 查 表 映射 的 方 式 。 在 Wi o s系列 操 作 系 统 中 ,使 用 V + 编 程 n w d C+ 时 ,这 种 字 符 映射 不 需 要 由程 序 员 来 编 写 , 可 以使 用 Widw no s
96 ( B 字符 集 ) 中 国台湾地 区使用代 码 化 大 全 的 程 序界 面
符 集 ) 程 序 启 动 时 . 自动 将 多 字 节 代 码 页设 置 为 操 作 系 统 。 默 认 的 代 码 页 。 运 行 库 中 大 多 数 多 字 节 字 符 函 数 的 行 为 , 与 当前 多 字 节 代 码 页设 置 有 关 。 比如 记 事 本 程 序 (o pdee nt a . ) e x 在 打 开 一 个 A S 编 码 的 文 本 时 ,会 根 据 操 作 系 统 的 中 的 设 NI
节 省 存 储 空 间 、提 高处 理 速 度 ,一 些 国家 和 地 区为 文 字 制 定 了 相 应 的字 符 集 ,有 的 一 种文 字 存 在 多种 字 符 集 。字 符 集 可 以 以 表 格 形 式 描 述 为 字 符 到单 字 节值 或 多 字节 值 的 映射 。 A C I S I码
Unicode和UTF-8之间的转换

Unicode和UTF-8之间的转换⼀、引⾔通过这⼏天的研究,终于明⽩了Unicode和UTF-8之间编码的区别。
Unicode是⼀个字符集,⽽UTF-8是Unicode的其中⼀种,Unicode是定长的都为双字节,⽽UTF-8是可变的,对于汉字来说Unicode占有的字节⽐UTF-8占⽤的字节少1个字节。
Unicode为双字节,⽽UTF-8中汉字占三个字节。
注: Unicode编码⽬前规划的总空间是17个平⾯,0x0000 ⾄ 0x10FFFF。
每个平⾯有 65536 个码点。
因此这个总的长度也有⼀百多万个。
⼆、UTF-8 UTF-8编码字符理论上可以最多到6个字节长,然⽽16位BMP(Basic Multilingual Plane)字符最多只⽤到3字节长。
下⾯看⼀下UTF-8编码表:1 U-00000000 - U-0000007F: 0xxxxxxx23 U-00000080 - U-000007FF: 110xxxxx 10xxxxxx45 U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx67 U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx89 U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx1011 U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx xxx 的位置由字符编码数的⼆进制表⽰的位填⼊,越靠右的 x 具有越少的特殊意义,只⽤最短的那个⾜够表达⼀个字符编码数的多字节串。
注意在多字节串中,第⼀个字节的开头"1"的数⽬就是整个串中字节的数⽬。
VC2010中初学者常见错误、警告和问题

《Visual C++ 2010入门教程》系列四:VC2010中初学者常见错误、警告和问题这一章将帮助大家解释一些常见的错误、警告和问题,帮助大家去理解和解决一些常见问题,并了解它的根本原因。
iostream.h与<iostream>下面的代码为什么在VC2010下面编译不过去?#include <iostream.h>int main(){cout<<"Hello World."<<endl;return 0;}错误信息:fatal error C1083: 无法打开包括文件:“iostream.h”: No such file or directory造成这个错误的原因在于历史原因,在过去C++98标准尚未订立的时候,C++的标准输入输出流确实是定义在这个文件里面的,这是C风格的定义方法,随着C++98标准的确定,iostream.h已经被取消,至少在VC2010下面是这样的,取而代之的是我们要用<iostream>头文件来代替,你甚至可以认为<iostream>是这样定义的:namespace std{#include "iostream.h"}因此我们可以简单的修改我们的Hello World。
#include <iostream>using namespace std;int main(){cout<<"Hello World."<<endl;return 0;}iostream.h是属于C++的头文件,而非C的,因此标准订立的时候被改成了<iostream>。
而C的头文件stdio.h等依然可以继续使用,这是为了兼容C代码。
但是它们依然有对应的C++版本,如<cstdio> <cstdlib>等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
From:/kf/201108/102015.html
Unicode :宽字节字符集
1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数?
可以调用Microsoft Visual C++的运行期库包含函数_mbslen来操作多字节(既包括单字节也包括双字节)字符串。
调用strlen函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。
2. 如何对DBCS(双字节字符集)字符串进行操作?
函数描述
PTSTR CharNext (LPCTSTR ); 返回字符串中下一个字符的地址
PTSTR CharPrev (LPCTSTR, LPCTSTR );返回字符串中上一个字符的地址
BOOL IsDBCSLeadByte( BYTE );如果该字节是DBCS字符的第一个字节,则返回非0值
3. 为什么要使用Unicode?
(1)可以很容易地在不同语言之间进行数据交换。
(2)使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。
(3)提高应用程序的运行效率。
Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。
如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。
进行这些字符串的转换需要占用系统的时间和内存。
通过从头开始用Unicode来开发应用程序,就能够使你的应用程序更加有效地运行。
Windows CE 本身就是使用Unicode的一种操作系统,完全不支持ANSI Windows 函数
Windows 98 只支持ANSI,只能为ANSI开发应用程序。
Microsoft公司将COM从16位Windows转换成Win32时,公司决定需要字符串的所有COM接口方法都只能接受Unicode字符串。
4. 如何编写Unicode源代码?
Microsoft公司为Unicode设计了WindowsAPI,这样,可以尽量减少代码的影响。
实际上,可以编写单个源代码文件,以便使用或者不使用Unicode来对它进行编译。
只需要定义两个宏(UNICODE和_UNICODE),就可以修改然后重新编译该源文件。
_UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。
当编译源代码模块时,通常必须同时定义这两个宏。
5. Windows定义的Unicode数据类型有哪些?
数据类型说明
WCHAR Unicode字符
PWSTR 指向Unicode字符串的指针
PCWSTR 指向一个恒定的Unicode字符串的指针
对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。
ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。
6. 如何对Unicode进行操作?
字符集特性实例
ANSI 操作函数以str开头strcpy
Unicode 操作函数以wcs开头wcscpy
MBCS 操作函数以_mbs开头_mbscpy
ANSI/Unicode 操作函数以_tcs开头_tcscpy(C运行期库)
ANSI/Unicode 操作函数以lstr开头lstrcpy(Windows函数)
所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。
ANSI 版本函数结尾以A表示;Unicode版本函数结尾以W表示。
Windows会如下定义:#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE
7. 如何表示Unicode字符串常量?
字符集实例
ANSI “string”
Unicode L“string”
ANSI/Unicode T(“string”)或_TEXT(“string”)if( szError[0] == _TEXT(‘J’) ){ }
8. 为什么应当尽量使用操作系统函数?
这将有助于稍稍提高应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用。
由于这些函数使用得很多,因此,在应用程序运行时,它们可能已经被装入RAM。
如:StrCat,StrChr,StrCmp和StrCpy等。
9. 如何编写符合ANSI和Unicode的应用程序?
(1)将文本串视为字符数组,而不是chars数组或字节数组。
(2)将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串。
(3)将显式数据类型(如BYTE和PBYTE)用于字节、字节指针和数据缓存。
(4)将TEXT宏用于原义字符和字符串。
(5)执行全局性替换(例如用PTSTR替换PSTR)。
(6)修改字符串运算问题。
例如函数通常希望在字符中传递一个缓存的大小,而不是字节。
这意味着不应该传递sizeof(szBuffer),而应该传递(sizeof(szBuffer)/sizeof(TCHAR)。
另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那么请记住要按字节来分配内存。
这就是说,应该调用malloc(nCharacters *sizeof(TCHAR)),而不是调用malloc(nCharacters)。
10. 如何对字符串进行有选择的比较?
通过调用CompareString来实现。
标志含义
NORM_IGNORECASE 忽略字母的大小写
NORM_IGNOREKANA TYPE 不区分平假名与片假名字符
NORM_IGNORENONSPACE 忽略无间隔字符
NORM_IGNORESYMBOLS 忽略符号
NORM_IGNOREWIDTH 不区分单字节字符与作为双字节字符的同一个字符
SORT_STRINGSORT 将标点符号作为普通符号来处理
11. 如何判断一个文本文件是ANSI还是Unicode?
判断如果文本文件的开头两个字节是0xFF和0xFE,那么就是Unicode,否则是ANSI。
12. 如何判断一段字符串是ANSI还是Unicode?
用IsTextUnicode进行判断。
IsTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容。
由于这不是一种确切的科学方法,因此IsTextUnicode有可能返回不正确的结果。
13. 如何在Unicode与ANSI之间转换字符串?
Windows函数MultiByteToWideChar用于将多字节字符串转换成宽字符串;函数WideCharToMultiByte将宽字符串转换成等价的多字节字符串。
本文出自“踏雪无痕”。