Write your own Windows string classes encapsulate string format conversions and common operations for ease of use

Source: Internet
Author: User

Recently developed speech recognition projects often encounter transcoding problems, various width byte conversion, ASNI, UTF8, Wide-byte ... The code is lengthy, tedious, and poorly maintained. decided to write a string class that can directly use the various encodings, so that the implementation of one, the function is not much, but enough. Because string and wstring share data under multiple threads, there is a problem with only the most basic char and wchar_t.

Based on the Windows platform, the code is as follows


/************ Title: Custom String Class ************************************************** date:2014/12/14************************************************** Author: Liu Xu ************************************ blog:http://blog.csdn.net/liuxucoder************************************************** */#ifndef _ _ykstring#define __ykstring#include <cstring> #include <new> #include <tchar.h> #include <  strsafe.h> #include <Windows.h> #define MAX_COUNT 1024000typedef unsigned char BYTE; Decimal to hexadecimal inline BYTE int_to_hex (const byte src) {return src > 9?  (src+55): (src+48); } 
Hexadecimal goto decimal Inline BYTE hex_to_int (const byte &x) {return isdigit (x)? x ' 0 ': X ' A ' +10; }/**@ Custom String class */class cykstring{public:/**@ Purpose: String transcoding, converted from ANSI to wchar_t*@ parameter: const char* szansi transcoding before ANSI string *@ parameter: wchar_t* SZW Char after transcoding wchar_t string *@ return value: BOOL succeeds return true, Failure returns False*/bool Ansi_to_wchar (const char* szansi,wchar_t*& szwchar) {bool res = false;size_t Nlen = MultiByteToWideChar (CP_ACP, NULL, Szansi,-1, NULL, 0); wchar_t* strtemp = Null;nlen = (nlen+1) * sizeof (wchar_t); __try{if (NULL = = (Szwchar = new Wchar_t[nlen]) {__leave;} if (NULL = = (strtemp = new Wchar_t[nlen])) {__leave;} ZeroMemory (Szwchar, Nlen); ZeroMemory (strtemp, Nlen); if (0 = = MultiByteToWideChar (CP_ACP, NULL, Szansi,-1, strtemp, Nlen)) {__leave;} if (S_OK! = Stringcchcopyw (Szwchar, Nlen, strtemp)) {__leave;} res = true;} __finally{if (null! = strtemp) {Delete []strtemp;strtemp = NULL;}} return res;} /**@ Purpose: String transcoding, converted from Utf-8 to wchar_t*@ parameters: const char* SzUtf8 transcoding before Utf-8 string *@ parameter: wchar_t* szwchar transcoding wchar_t string *@ return value: BOOL successfully returned TR UE, failed to return False*/boolUtf8_to_wchar (const char* szutf8,wchar_t*& szwchar) {bool res = false;size_t Nlen = MultiByteToWideChar (CP_UTF8, NULL , SzUtf8, 1, NULL, 0), wchar_t* strtemp =null;nlen = (nlen+1) *sizeof (wchar_t); __try{if (NULL = = (Szwchar = new Wchar_t[nlen ]) {__leave;} if (NULL = = (strtemp = new Wchar_t[nlen])) {__leave;} ZeroMemory (Szwchar, Nlen); ZeroMemory (strtemp, Nlen); if (0 = = MultiByteToWideChar (Cp_utf8, NULL, SzUtf8,-1, strtemp, Nlen)) {__leave;} if (S_OK! = Stringcchcopyw (Szwchar, Nlen, strtemp)) {__leave;} res = true;} __finally{if (null! = strtemp) {Delete []strtemp;strtemp = NULL;}} return res;} /**@ Purpose: String transcoding, converted from wchar_t to ansi*@ parameters: const wchar_t* Szwchar transcoding before wchar_t string *@ parameter: char* szansi transcoding after Ansi string *@ return value: BOOL Successful return True , the failure returns False*/bool Wchar_to_ansi (const wchar_t* szwchar,char*& szansi) {bool res = false;size_t Nlen = 0;char *strTemp = NULL; STRINGCCHLENGTHW (Szwchar, Max_count, &nlen); Nlen = (nlen+1) *sizeof (wchar_t); __try{if (NULL = = (Szansi = new char[ Nlen]) {__leave;} if (NULL = = (strtemp = new Char[nLen])) {__leave;} ZeroMemory (Szansi, Nlen); ZeroMemory (strtemp, Nlen); if (0 = = WideCharToMultiByte (CP_ACP, 0, Szwchar,-1, strtemp, nlen, NULL, NULL)) {__leave;} if (S_OK! = Stringcchcopya (Szansi, Nlen, strtemp)) {__leave;} res = true;} __finally{if (null! = strtemp) {Delete []strtemp;strtemp = NULL;}} return res;} /**@ Purpose: String transcoding, converted from wchar_t to utf-8*@ parameters: const wchar_t* Szwchar transcoding before wchar_t string *@ parameter: char* szUtf8 transcoding Utf-8 string *@ return value: BOOL successfully returned TR  UE, failed to return False*/bool Wchar_to_utf8 (const wchar_t* szwchar,char*& SzUtf8) {bool res = false;size_t Nlen = 0;char *strtemp = NULL; STRINGCCHLENGTHW (Szwchar, Max_count, &nlen); Nlen = (nlen+1) *2*sizeof (wchar_t); __try{if (NULL = = (SzUtf8 = new char[ Nlen]) {__leave;} if (NULL = = (strtemp = new Char[nlen])) {__leave;} ZeroMemory (SzUtf8, Nlen); ZeroMemory (strtemp, Nlen); if (0 = = WideCharToMultiByte (Cp_utf8, 0, Szwchar,-1, strtemp, nlen, NULL, NULL)) {__leave;} if (S_OK! = Stringcchcopya (SzUtf8, Nlen, strtemp)) {__leave;} res = true;} __finally{if (NULL! = strtemp) {delete []strtemp;strtemp = NULL;}} return res;} /**@ Purpose: String transcoding, converted from ANSI to utf-8*@ parameter: const char * szansi transcoding before ANSI string *@ parameter: char* szUtf8 transcoding Utf-8 string *@ return value: BOOL successfully returns TRUE, failed to return Back to False*/bool Ansi_to_utf8 (const char* szansi,char*& SzUtf8) {bool res = false;size_t Nlen = 0;wchar_t* strtemp = NULL; Stringcchlengtha (Szansi, Max_count, &nlen), __try{if (NULL = = (strtemp = new Wchar_t[nlen+1])) {__leave;} if (false = = Ansi_to_wchar (Szansi, strtemp)) {__leave;} if (false = = Wchar_to_utf8 (strtemp, SzUtf8)) {__leave;} res = true;} __finally{if (null! = strtemp) {Delete []strtemp;strtemp = NULL;}} return res;} /**@ Purpose: String transcoding, converted from Utf-8 to ansi*@ parameter: const char * SzUtf8 transcoding before Utf-8 string *@ parameter: char* szansi transcoding after Ansi string *@ return value: BOOL successfully returns TRUE, failed to return False*/bool utf8_to_ansi (const char* szutf8,char*& szansi) {bool res = false;size_t Nlen = 0;wchar_t* strTemp = NULL;S Tringcchlengtha (SzUtf8, Max_count, &nlen), __try{if (NULL = = (strtemp = new Wchar_t[nlen+1])) {__leave;} if (false = = (Utf8_to_wchar (SzUtf8, strtemp))) {__leave;} if (False ==wchar_to_anSi (strtemp, szansi)) {__leave;} res = true;} __finally{if (null! = strtemp) {Delete []strtemp;strtemp = NULL;}} return res;} Public:cykstring (size_t len = $) {Last_style = Style_char;isansi = True;m_char = Null;m_wchar = Null;try{m_char = new Cha R[len];m_wchar = new Wchar_t[len]; ZeroMemory (M_char, Len); ZeroMemory (M_wchar, Len);} catch (Std::bad_alloc) {if (m_char) {delete []m_char;} if (m_wchar) {delete []m_wchar;} throw;//throws an exception here, stops the constructor, frees the resource}};~cykstring (void) {if (NULL! = M_char) {Delete []m_char;m_char = NULL;} if (NULL! = M_wchar) {Delete []m_wchar;m_wchar = null;}};/ **@ Purpose: Refreshes the string, which is a consistent *@ parameter for each string of strings stored: No *@ return value: BOOL successfully returns true failure return False*/bool flushstring () {if (Style_char = = Last_style) {if (FAL SE = = isansi) {return Utf8_to_wchar (M_char, M_wchar);} Else{return Ansi_to_wchar (M_char, M_wchar);}} else if (Style_wchar = = Last_style) {if (false = = Isansi) {return Wchar_to_utf8 (M_wchar, M_char);} Else{return Wchar_to_ansi (M_wchar, M_char);}} /**@ Purpose: Use the char* format of the string *@ parameter: No *@ return value: char* char* string Address */char* aschar_str () {flushstring ();Last_style = Style_char;return M_char;} /**@ Purpose: Use the wchar_t* format of the string *@ parameter: No *@ return value: wchar_t* wchar_t* string Address */wchar_t* aswchar_str () {flushstring (); Last_style = Style_wchar;return M_wchar;} /**@ Purpose: Returns the length of the string *@ parameter: No *@ return value: size_t string length */size_t getlength () {flushstring (); size_t nlen = 0; STRINGCCHLENGTHW (M_wchar, Max_count, &nlen); return nlen;} /**@ Purpose: To determine whether a string is empty *@ parameter: No *@ return value: BOOL NULL returns TRUE, non-null returns False*/bool IsEmpty () {flushstring (); return GetLength ()? False:true;} /**@ Purpose: Converts a string to an ANSI encoded form *@ parameter: No *@ return value: char* the string after transcoding */char* Toansi () {flushstring (); if (false = = Isansi) {Isansi = True;if ( false = = Utf8_to_ansi (M_char, M_char)) {M_char = NULL;}} Return m_char;};/ **@ Purpose: Converts a string to Utf-8 encoded form *@ parameter: No *@ return value: char* transcoding string */char* toutf_8 () {flushstring (); if (true = = Isansi) {Isansi = False;if ( false = = Ansi_to_utf8 (M_char, M_char)) {M_char = NULL;}} Return m_char;};/ **@ Purpose: To encode the Utf-8 format string with Urlcode encoding *@ parameter: No *@ return value: char* encoded string */char* Urlencode_utf8 () {bool isansitemp = Isansi;  Toutf_8 (); char* result = NULL; size_t nlen = 0; Stringcchlengtha (M_char, Max_count, &nlen); size_t pos = 0; The length of the resulting string is marked Try{result = new char[(nlen+1) *sizeof (wchar_t)]; ZeroMemory (result, sizeof (result));} catch (std::bad_alloc) {delete []result;result = Null;return result;} for (size_t i = 0; i < Nlen; i++) {if (Isalnum ((BYTE) m_char[i]) | |/* Determines whether a letter or number must be type-cast */': ' = = m_char[i]| | '/' = = m_char[i]| |     ' _ ' = = M_char[i] | |     '. ' = = m_char[i]| |  ' ~ ' = = m_char[i]| |   '? ' = = m_char[i]| |   ' & ' = = m_char[i]| |   ' = ' = = M_char[i]) {result[pos++] = M_char[i];  Remains the same} else if (' = = M_char[i]) {//If it is a space result[pos++] = ' + ';  } else {//If it is a different character, BYTE temp = Int_to_hex ((BYTE) m_char[i]);  result[pos++] = '% ';    result[pos++] = Int_to_hex ((BYTE) m_char[i] >> 4);    result[pos++] = Int_to_hex ((BYTE) m_char[i]% 16); }}isansi = Isansitemp?  Toansi (): Toutf_8 ();//restore original code result[pos++] = ' + '; return result; }/**@ Purpose: The Ansi format string is encoded with Urlcode *@ parameter: No *@ return value: char* encoded string */char* Urlencode_ansi () {bool isansitemp = Isansi;  Toansi (); char* result = NULL;size_t nlen = 0;    Stringcchlengtha (M_char, Max_count, &nlen); size_t pos = 0; The length of the resulting string is marked Try{result = new char[(nlen+1) *sizeof (wchar_t)]; ZeroMemory (result, sizeof (result));} catch (std::bad_alloc) {delete []result;result = Null;return result;} for (size_t i = 0; i < Nlen; i++) {if (Isalnum ((BYTE) m_char[i]) | |/* Determines whether a letter or number must be type-cast */': ' = = m_char[i]| | '/' = = m_char[i]| |     ' _ ' = = M_char[i] | |     '. ' = = m_char[i]| |  ' ~ ' = = m_char[i]| |   '? ' = = m_char[i]| |   ' & ' = = m_char[i]| |   ' = ' = = M_char[i]) {result[pos++] = M_char[i];  Remains the same} else if (' = = M_char[i]) {//If it is a space result[pos++] = ' + ';  } else {//If it is a different character, BYTE temp = Int_to_hex ((BYTE) m_char[i]);  result[pos++] = '% ';    result[pos++] = Int_to_hex ((BYTE) m_char[i] >> 4);    result[pos++] = Int_to_hex ((BYTE) m_char[i]% 16); }}isansi = Isansitemp?  Toansi (): Toutf_8 ();//restore original code result[pos++] = ' + '; return result; }/**@ Purpose: To decode a string with Urlcode *@ parameter: No *@ return value: char* decoded string (format depends on the format of the string itself) */char* UrlDecode () {flushstring (); char* result = NULL; size_t nlen = 0;    Stringcchlengtha (M_char, Max_count, &nlen); size_t pos = 0; The length of the resulting string is marked Try{result = new char[(nlen+1) *sizeof (wchar_t)]; ZeroMemory (result, sizeof (result));} catch (std::bad_alloc) {delete []result;result = Null;return result;} for (size_t i = 0; i < Nlen; i++) {if ('% ' = = M_char[i]) {//Determine if the character is byte Cha;cha = Hex_to_int (m_char[i+1]) <<4;cha |   = Hex_to_int (m_char[i+2]); result[pos++] = (char) cha;  i + = 2;}  else if (' + ' = = M_char[i]) {//If it is a space result[pos++] = ';  } else {//If other characters result[pos++] = m_char[i];//remains the same}}result[pos++] = ' + '; return result;  }/**@ Purpose: To format a string (char*) *@ parameter: char* format formatted string *@ parameter: ... Parameter list *@ return value: number of int formatting parameters, 1 indicates failure */int format (char* format, ...) {Last_style = style_char;va_list argList = null;size_t Nlen = 0;va_start (argList, Format); Nlen = _vsprintf_p (NULL, 0, Form At, argList); Try{m_char = new char[nlen+1];_vsprintf_p (M_char, Nlen + 1, Format, argList); return flushstring ();} catch (std::bad_alloc) {delete []m_chaR;m_char = null;return-1;}}  /**@ Purpose: To format a string (wchar_t*) *@ parameter: wchar_t* format formatted string *@ parameter: ... Parameter list *@ return value: number of int formatting parameters, 1 indicates failure */int format (wchar_t* format, ...) {Last_style = style_wchar;va_list argList = null;size_t Nlen = 0;va_start (argList, Format); Nlen = _vswprintf_p (NULL, 0, Fo Rmat, argList) Try{m_wchar = new wchar_t[nlen+1];_vswprintf_p (M_wchar, Nlen + 1, Format, argList); return flushstring ();} catch (std::bad_alloc) {delete []m_wchar;m_wchar = null;return-1;}} public://== operator overload bool operator = = (Const char* obj) {return 0 = = strncmp (M_char, obj, max_count)? True:false;} BOOL operator = = (Const wchar_t* obj) {return cstr_equal = = Comparestringordinal (M_wchar,-1, obj,-1, false)? true:fals e;} BOOL operator = = (cykstring &obj) {return cstr_equal = = Comparestringordinal (M_wchar,-1, Obj.aswchar_str (),-1, False ) ? True:false;} = operator overload cykstring& operator = (const char* obj) {last_style = style_char;if (*this = = obj) {return *this;} size_t nLen1 = GetLength () *sizeof (wchar_t); size_t nLen2 = 0; Stringcchlengtha (obj, Max_count, &nlen2); NLen2 + = 1;if (nLen1 >= nLen2) {stringcchcopya (M_char, nLen1, obj);} Else{char *strtemp = null;__try{if (NULL = = (strtemp = new Char[nlen2])) {__leave;} if (S_OK! = Stringcchcopya (strtemp, NLen2, obj)) {__leave;} Delete M_char;m_char = null;if (NULL = = (M_char = new Char[nlen2])) {__leave;} if (S_OK! = Stringcchcopya (M_char, NLen2, strtemp)) {__leave;}} __finally{if (null! = strtemp) {Delete []strtemp;strtemp = NULL; Flushstring ();}}} return *this;} cykstring& operator = (const wchar_t* obj) {last_style = style_wchar;if (*this = = obj) {return *this;} size_t nLen1 = GetLength () *sizeof (wchar_t); size_t nLen2 = 0; STRINGCCHLENGTHW (obj, Max_count, &nlen2), nLen2 *= sizeof (wchar_t), if (nLen1 >= nLen2) {stringcchcopyw (M_wchar, NLen1, obj);} else{wchar_t *strtemp = null;__try{if (NULL = = (strtemp = new Wchar_t[nlen2])) {__leave;} if (S_OK! = Stringcchcopyw (strtemp, NLen2, obj)) {__leave;} Delete []m_wchar;m_wchar = null;if (NULL = = (M_wchar = new Wchar_t[nlen2])) {__Leave;} if (S_OK! = Stringcchcopyw (M_wchar, NLen2, strtemp)) {__leave;}} __finally{if (null! = strtemp) {Delete []strtemp;strtemp = NULL; Flushstring ();}}} return *this;} cykstring& operator = (cykstring &obj) {return *this = Obj.aswchar_str ();}  + = operator overload cykstring& operator + = (const char* obj) {last_style = style_char;size_t nLen1 = GetLength () *sizeof (wchar_t) + 1;size_t nLen2 = 0; Stringcchlengtha (obj, Max_count, &nlen2); NLen2 + = 1;char *strtemp = null;__try{if (NULL = = (strtemp = new Char[nlen1])) {__leave;} if (S_OK! = Stringcchcopya (strtemp, NLen1, M_char)) {__leave;} Delete []m_wchar;m_wchar = null;if (NULL = = (M_char = new Char[nlen1+nlen2])) {__leave;} if (S_OK! = Stringcchcopya (M_char, NLen1, strtemp)) {__leave;} if (S_OK! = Stringcchcata (M_char, Nlen1+nlen2, obj)) {__leave;}} __finally{if (null! = strtemp) {Delete []strtemp;strtemp = NULL; Flushstring ();}} return *this;} cykstring& operator + = (const wchar_t* obj) {last_style = style_wchar;size_t nLen1 = GetLength () *sizeof (wchar_t); size _T nLen2 = 0; STRINGCCHLENGTHW (obj, Max_count, &nlen2); nLen2 *= sizeof (wchar_t); wchar_t *strtemp = null;__try{if (NULL = = (strtemp = new Wchar_t[nlen1])) {__leave;} if (S_OK! = Stringcchcopyw (strtemp, NLen1, M_wchar)) {__leave;} Delete []m_wchar;m_wchar = null;if (NULL = = (M_wchar = new Wchar_t[nlen1+nlen2])) {__leave;} if (S_OK! = Stringcchcopyw (M_wchar, NLen1, strtemp)) {__leave;} if (S_OK! = STRINGCCHCATW (M_wchar, Nlen1+nlen2, obj)) {__leave;}} __finally{if (null! = strtemp) {Delete []strtemp;strtemp = NULL; Flushstring ();}} return *this;} cykstring& operator + = (cykstring &obj) {return *this + = Obj.aswchar_str (); protected:char* m_char;//Internal string char* narrow byte type wchar_t* m_wchar;//internal string wchar* wide byte type private:enum lastchange{style_char= 1, Style_wchar= 2};//last changed data type bool isansi;//string is ANSI encoded format int last_style;//last changed data type tag}; #endif//!__ykstring


Write your own Windows string classes encapsulate string format conversions and common operations for ease of use

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.