Windows核心编程17章------后续
一、ANSI和UNICODE知识点
二、 用内存映射文件来把一个ANSI或UNICODE文本文件内容颠倒过来。
三、进程间共享数据,参考API一日一练
一、ANSI和UNICODE知识点
1、 判断一个文本是ANSI还是UNICODE
2、 如何对字符串进行有选择的比较
3、 让程序支持UNICODE
4、 Windows定义的UNICODE数据类型
5、 如何对UNICODE操作
6、 ANSI和UNICODE的相互转换
1、判断一个文本是ANSI还是UNICODE
1)判断如果文本文件的开头两个字节是0xFF和0xFE,那么就是Unicode,否则是ANSI。
2)用IsTextUnicode进行判断。IsTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此 IsTextUnicode有可能返回不正确的结果。
2、通过调用CompareString来实现。
标志
NORM_IGNORECASE
NORM_IGNOREKANATYPE
NORM_IGNORENONSPACE
NORM_IGNORESYMBOLS
NORM_IGNOREWIDTH
SORT_STRINGSORT
3、在vc编译选项上,在vc7.0以上在工程的属性页中的“字符集”选上 "使用
1)改语言定义:
在project
2)改入口函数:
在 "link "页中的 "project
3)在代码上,处理字符中的多用TCHAR.H中的宏,如strcpy用_tcscpy代替,用TCHAR代char,
用TCHAR
4)注意调试UNICODE程序时,需要在安装时VC选择所有选项,否则会缺少动态库和相应的.lib文件
4、Windows定义的UNICODE数据类型
数据类型
WCHAR
PWSTR
PCWSTR
对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。
ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。
5、如何对UNICODE操作
字符集
ANSI
Unicode
MBCS
ANSI/Unicode
ANSI/Unicode
6、ANSI和UNICODE的相互转换
1)将ANSI转换到Unicode
(1)通过L这个宏来实现,例如:
(2)通过MultiByteToWideChar函数实现转换,例如:
char
WCHAR
CLSID
long
szWideProgID[lLen]
(3)通过A2W宏来实现,例如:
2)将Unicode转换到ANSI
(1)使用WideCharToMultiByte,例如:
//
(2)使用W2A宏来实现,例如:
USES_CONVERSION;
pTemp=W2A(wszSomeString);
因为ANSI转UNICODE,如果使用A2W或MultiByteToWideChar(第一个参数是CP_ACP)的话,是根据系统默认的转码表,把转入的ANSI字符串看作Multi-Bytes字符串处理的,如果是中文(中文windows默认就是中文),一个大于0x87的byte可能和下一byte一起被看作一个汉字,然后根据汉字的Unicode编码转换为相同的Unicode汉字,如果找不到相应的编码,一般就用一个默认的字符来取代它(一般是问号“?”),由此看,如果随便把一段数据给他转,转化很复杂而且极可能不可逆,而且你加密过的ANSI码是相当混乱的有很多〉0x87的byte,转换就变得不可逆了。
建议自己直接就这样写:
CHAR
WCHAR
int
}
lpUnicode[i]
然后按相同的方法转回来,因为对于0~0x87的ANSI字符串,对应的Unicode码就是相同的16位值,至于其他的,你的字符串反正加了密,没必要转换成显示出来是一样的字符,就按同样的方法处理了,其实如果中间的字符串不用显示或别的,直接reutrn
二、用内存映射文件来把一个ANSI或UNICODE文本文件内容颠倒过来。
两个注意点:颠倒前,先给指定文件复制一份,防止颠倒后文件不可逆。
? 因文本文件并非以字符0结尾,而C语言格式字符串最后一个字符必须是0。所以创建文件映射对象时,文件长度增加一个宽字符的大小(用来存放字符0)。
? 在一个文本文件中,每行末尾的回车换行符”\r\n”也会被颠倒,用_strrev倒序后需将”\n\r”转为”\r\n”。
BOOL FileReverse(LPCTSTR pszPathname){//Open the file for reading and writingHANDLE hFile = CreateFile(pszPathname, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (INVALID_HANDLE_VALUE == hFile){AfxMessageBox(_T("File could not be opened."));return FALSE;}//Create the file-mapping object.DWORD dwFileSize = GetFileSize(hFile, NULL);HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwFileSize + sizeof(TCHAR), NULL);if (NULL == hFileMap){AfxMessageBox(_T("File map could not be opened."));CloseHandle(hFile);return FALSE;}//Get the address where the first byte of the file is mapped into memory.PVOID pvFile = MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0);if (NULL == pvFile){AfxMessageBox(_T("Could not map view of file"));CloseHandle(hFileMap);CloseHandle(hFile);return FALSE;}//Does the buffer contain ANSI or Unicodeint iUnicodeTestFlags = -1;BOOL bIsTextUnicode = IsTextUnicode(pvFile, dwFileSize, &iUnicodeTestFlags);if (!bIsTextUnicode){//把一个字符0写到文件末尾并颠倒字符串PSTR pchANSI = (PSTR)pvFile;pchANSI[dwFileSize / sizeof(char)] = 0;//reverse the contexts of the file_strrev(pchANSI); //ansi用_strrev(pvFile);//convert all "\n\r" combinations back to "\r\n" to preserve//the normal end-of-line sequence.pchANSI = strstr(pchANSI, "\n\r");while (pchANSI != NULL){*pchANSI++ = '\r';*pchANSI++ = '\n';pchANSI = strstr(pchANSI, "\n\r");}}else{//把一个字符0写到文件末尾并颠倒字符串PWSTR pchUnicode = (PWSTR)pvFile;pchUnicode[dwFileSize / sizeof(WCHAR)] = 0;if ((iUnicodeTestFlags & IS_TEXT_UNICODE_SIGNATURE) !=0){//if the first character is the Unicode BOM(byte-order-mark)//0xFEFF,keep the character at the begining of the file.pchUnicode++;}_wcsrev(pchUnicode);//convert all "\n\r" combinations back to "\r\n" to preserve//the normal end-of-line sequence.pchUnicode = wcsstr(pchUnicode, L"\n\r");while (pchUnicode!=NULL){*pchUnicode++ = L'\r';*pchUnicode++ = L'\n';pchUnicode = wcsstr(pchUnicode, L"\n\r");}}//Clean up everything before exiting.UnmapViewOfFile(pvFile);CloseHandle(hFileMap);//Remove trailing zero character added earlier.SetFilePointer(hFile, dwFileSize, NULL, FILE_BEGIN);SetEndOfFile(hFile);CloseHandle(hFile);return TRUE;}