最近在使用c++开发,系统使用的TChar字符,有时候要用到char字符,经常需要把Tchar和char进行互相转换。
#pragma once
#include "shlwapi.h"
#include "atlstr.h"
class C_StringConvertor
{
public:
C_StringConvertor();
virtual ~C_StringConvertor();
void Initialize();
void SetMultiByte(LPCSTR lpszMultiByte);
void SetWideChars(LPCWSTR lpszWideChars);
void SetUnicodeString(LPCTSTR lpszString);
LPCSTR GetMultiByte();
LPCWSTR GetWideChars();
LPCTSTR GetUnicodeString();
protected:
LPSTR m_lpMultiByte;
LPWSTR m_lpWideChars;
protected:
void ToMultiByte();
void ToWideChars();
};
inline C_StringConvertor::C_StringConvertor()
{
m_lpMultiByte = NULL;
m_lpWideChars = NULL;
}
inline C_StringConvertor::~C_StringConvertor()
{
Initialize();
}
inline void C_StringConvertor::Initialize()
{
if (m_lpMultiByte)
{
::LocalFree((HLOCAL)(m_lpMultiByte));
m_lpMultiByte = NULL;
}
if (m_lpWideChars)
{
::LocalFree((HLOCAL)(m_lpWideChars));
m_lpWideChars = NULL;
}
}
inline void C_StringConvertor::SetMultiByte(LPCSTR lpszMultiByte)
{
if (m_lpMultiByte)
{
::LocalFree((HLOCAL)(m_lpMultiByte));
m_lpMultiByte = NULL;
}
if (lpszMultiByte)
{
m_lpMultiByte = ::StrDupA(lpszMultiByte);
ToWideChars();
}
}
inline void C_StringConvertor::SetWideChars(LPCWSTR lpszWideChars)
{
if (m_lpWideChars)
{
::LocalFree((HLOCAL)(m_lpWideChars));
m_lpWideChars = NULL;
}
if (lpszWideChars)
{
m_lpWideChars = ::StrDupW(lpszWideChars);
ToMultiByte();
}
}
inline void C_StringConvertor::SetUnicodeString(LPCTSTR lpszString)
{
#ifdef UNICODE
SetWideChars(lpszString);
#else
SetMultiByte(lpszString);
#endif
}
inline LPCSTR C_StringConvertor::GetMultiByte()
{
return m_lpMultiByte;
}
inline LPCWSTR C_StringConvertor::GetWideChars()
{
return m_lpWideChars;
}
inline LPCTSTR C_StringConvertor::GetUnicodeString()
{
#ifdef UNICODE
return GetWideChars();
#else
return GetMultiByte();
#endif
}
inline void C_StringConvertor::ToMultiByte()
{
int nLength = 0;
int nBufferSize = 0;
if (m_lpMultiByte)
{
::LocalFree((HLOCAL)(m_lpMultiByte));
m_lpMultiByte = NULL;
}
if (m_lpWideChars != NULL)
{
nLength = ::WideCharToMultiByte(CP_ACP, NULL, m_lpWideChars, -1, NULL, 0, NULL, FALSE);
nBufferSize = ((nLength + 1) * sizeof(CHAR));
m_lpMultiByte = (LPSTR)(::LocalAlloc(LPTR, nBufferSize));
if (m_lpMultiByte)
{
::WideCharToMultiByte (CP_ACP, NULL, m_lpWideChars, -1, m_lpMultiByte, nLength, NULL, FALSE);
}
}
}
inline void C_StringConvertor::ToWideChars()
{
int nLength = 0;
int nBufferSize = 0;
if (m_lpWideChars)
{
::LocalFree((HLOCAL)(m_lpWideChars));
m_lpWideChars = NULL;
}
if (m_lpMultiByte != NULL)
{
nLength = ::MultiByteToWideChar(CP_ACP,0, m_lpMultiByte, -1, NULL,0);
nBufferSize = ((nLength + 1) * sizeof(WCHAR));
m_lpWideChars = (LPWSTR)(::LocalAlloc(LPTR, nBufferSize));
if (m_lpWideChars)
{
::MultiByteToWideChar(CP_ACP, 0, m_lpMultiByte, -1, m_lpWideChars, nLength);
}
}
}
inline BOOL CheckDirectoryString(LPCTSTR lpszString)
{
TCHAR chDriverName = 0;
CString strDirectory = _T("");
strDirectory = lpszString;
strDirectory.Trim();
if (strDirectory.IsEmpty())
{
return FALSE;
}
strDirectory.MakeLower();
chDriverName = strDirectory.GetAt(0);
if ((chDriverName < _T('a')) || chDriverName > (_T('z')))
{
return FALSE;
}
if (strDirectory.GetLength() == 2)
{
if (strDirectory.GetAt(1) != _T(':'))
{
return FALSE;
}
return TRUE;
}
if (strDirectory.Find(_T(":\\")) != 1)
{
return FALSE;
}
if (strDirectory.Find(_T("\\\\")) >= 0)
{
return FALSE;
}
CString strCheck = _T("/*\"<>|?");
if (strDirectory.FindOneOf(strCheck) >= 0)
{
return FALSE;
}
return TRUE;
}
相关推荐
这篇文档“关于C++字符转换的方法.pdf”以及相关的源代码“stringtest.cpp”将深入探讨这个主题。以下是一些核心知识点: 1. **字符类型**: C++提供了`char`类型来存储单个字符。它占据一个字节的空间,通常可以...
### C++中的字符转换 在C++编程语言中,字符转换是经常需要用到的功能之一,特别是在处理文本数据时。本文将详细介绍C++中字符转换的方法及其应用场景,并特别关注于`CString`与`LPTSTR`之间的转换,以及其他相关...
本篇文章将深入探讨如何使用C++编程语言将文本字符串转换成BMP(Bitmap)图片。 首先,我们需要了解BMP文件格式。BMP是Windows操作系统中常见的位图文件格式,它存储的是未经压缩的像素数据,包括图像宽度、高度、...
本文将详细介绍几种常用的C++字符串类型(`char *`、`wchar_t*`、`_bstr_t`、`CComBSTR`、`CString`、`basic_string` 和 `System.String`)之间的转换方法,并通过示例代码加以解释。 #### 1. `char *` 类型转换 `...
C++全角半角字符转换
### C++字符串转换详解 #### 一、概述 在C++编程中,字符串转换是非常常见的需求之一,尤其是在处理用户输入、文件操作等场景时。本文将详细介绍几种常见类型的字符串转换方法,包括`CString`, `int`, `string`, `...
在C++编程中,字符串加密和解密是信息安全领域中的重要技术,主要用于保护数据的隐私和安全性。本项目涉及的是DES(Data Encryption Standard)加密算法的实现,这是一种经典的对称加密算法,广泛应用于数据的加密...
4. `ToLower`/`ToUpper`:将字符串转换为小写或大写,常用于不区分大小写的比较。 5. `StartsWith`/`EndsWith`:检查字符串是否以指定的前缀或后缀开头或结束。 6. `Contains`:检测字符串中是否包含指定的子串。 7....
标准库如C标准库中的提供了mbstowcs()和wcstombs()函数,分别用来将多字节字符转换为宽字符,以及宽字符转换为多字节字符。C++的库提供了更为强大的转换工具,比如wstring_convert类,它支持Unicode和UTF-8之间的...
这些文件可以作为学习和实践C++字符串转换的好资源。 总结,C++中字符和字符串的转换涉及多种方法和函数,包括使用`std::string`,处理宽字符,以及转换不同的编码格式。了解和熟练掌握这些转换技巧对于编写跨平台...
在VC/C++中,`WideCharToMultiByte`函数用于将宽字符(通常是UTF-16)转换为多字节字符(如ANSI或UTF-8),而`MultiByteToWideChar`则是相反的过程。这两个函数都是Windows API的一部分,定义在`windows.h`头文件中...
同时,C++也允许将其他数据类型转换为字符串,例如使用`std::stringstream`进行类型转换,或者利用`std::to_string()`函数将基本类型转换为字符串。相反,将字符串转换为其他类型,如整型或浮点型,可以使用`std::...
在C++编程中,将JSON字符串转换为C++类对象是一项常见的任务,特别是在处理网络通信、数据存储或配置文件时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析...
在C++编程中,将字符串中的每个字符转换成16进制值并输出是一项常见的任务。这涉及到对字符串的处理和数字的进制转换。在本文中,我们将深入探讨如何实现这一目标,以及相关的C++语言特性。 首先,我们要了解字符串...
以下是一些常用的C++字符串转换函数的详细解释: 1. `atoi`(Array To Integer): - 功能:将一个字符串转换为整数。 - 使用方法:`int atoi(const char *nptr);` - 解释:`atoi`函数会从字符串`nptr`的第一个...
总结来说,在C/C++中处理字符串和进行字符与数字的转换,需要深入理解字符串的内存表示、ASCII码以及指针与数组的操作。在面试中,这些知识往往是考察应聘者编程能力的重要环节。掌握这些基本概念和技能对于编写高效...
### C++字符串完全指南 #### 一、Win32字符编码概述 在计算机科学中,字符串是一系列字符的集合,通常被用来表示文本。在C++编程语言中,字符串可以通过多种方式进行表示,包括传统的C风格字符串、标准模板库(STL)...
C++字符串处理大集合 在 C++ 中,字符串处理是非常重要的一部分,对于初学者来说,掌握字符串处理函数是非常必要的。下面我们将对 C++ 中的字符串处理函数进行详细的介绍。 C 语言字符串处理函数 1. 字符串长度:...
10. **字符与整数之间的转换**:通过`int(c)`可以把字符转换为对应的ASCII值,而`char(i)`可以把整数转换为字符。 以上就是关于C/C++字符表的一些核心知识点。理解并熟练运用这些概念,对于编写处理文本数据的程序...