【100分求解】 “char *”转换为“TCHAR * (提供所有代码 帮整理下 谢谢了 高手)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【100分求解】 “char *”转换为“TCHAR * (提供所有代码 帮整理下 谢谢了 高手)相关的知识,希望对你有一定的参考价值。

ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
AfxMessageBox(gethostbyname);

_________________
代码我有 但是不会 摆脱 帮写下 谢谢了

stdafx.h
wchar_t* ANSIToUnicode( const char* str ); // 1. ANSI to Unicode
char* UnicodeToANSI( const wchar_t* str ); // 2. Unicode to ANSIs
stdafx.cpp

wchar_t* ANSIToUnicode( const char* str ) // 1. ANSI to Unicode

int len = 0;
len = strlen(str);
int unicodeLen = ::MultiByteToWideChar( CP_ACP,
0,
str,
-1,
NULL,
0 );
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar( CP_ACP,
0,
str,
-1,
(LPWSTR)pUnicode,
unicodeLen );
//rt = ( wchar_t* )pUnicode;
//delete pUnicode;

return pUnicode;


char* UnicodeToANSI( const wchar_t* str ) // 2. Unicode to ANSI

char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = WideCharToMultiByte( CP_ACP,
0,
str,
-1,
NULL,
0,
NULL,
NULL );
pElementText = new char[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
::WideCharToMultiByte( CP_ACP,
0,
str,
-1,
pElementText,
iTextLen,
NULL,
NULL );
//string strText;
//strText = pElementText;
//delete[] pElementText;
return pElementText;


例子转换的例子:
Acsl 转换 Unic

TCHAR* psz = ANSIToUnicode(pBuf);
//SetDlgItemText(IDC_EDIT_RECV, psz);
free(psz);
Unic 转换 ACSL
hClip = GlobalAlloc(GMEM_MOVEABLE, str.GetLength() + 1);
//pBuf = (char*)GlobalLock(hClip);
char* psz = UnicodeToANSI( str );
Acsl 转换 Unic
hClip = GlobalAlloc(GMEM_MOVEABLE, str.GetLength() + 1);
char* psz = UnicodeToANSI( str );
Unic 转换 ACSL
TCHAR* psz = ANSIToUnicode(pBuf);

麻烦高手 帮写下转换代码

采集·附加高分

第一个就是宽字符到多字节字符转换函数,函数原型如下:

int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar
);

此函数把宽字符串转换成指定的新的字符串,如ANSI,UTF8等,新字符串不必是多字节字符集。参数:

CodePage: 指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,你也可以使用如下所示代码页之一。

CP_ACP 当前系统ANSI代码页
CP_MACCP 当前系统Macintosh代码页
CP_OEMCP 当前系统OEM代码页,一种原始设备制造商硬件扫描码
CP_SYMBOL Symbol代码页,用于Windows 2000及以后版本,我不明白是什么
CP_THREAD_ACP 当前线程ANSI代码页,用于Windows 2000及以后版本,我不明白是什么
CP_UTF7 UTF-7,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL
CP_UTF8 UTF-8,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL

我想最常用的应该是CP_ACP和CP_UTF8了,前者将宽字符转换为ANSI,后者转换为UTF8。

dwFlags: 指定如何处理没有转换的字符, 但不设此参数函数会运行的更快一些,我都是把它设为0。 可设的值如下表所示:
WC_NO_BEST_FIT_CHARS 把不能直接转换成相应多字节字符的Unicode字符转换成lpDefaultChar指定的默认字符。也就是说,如果把Unicode转换成多字节字符,然后再转换回来,你并不一定得到相同的Unicode字符,因为这期间可能使用了默认字符。此选项可以单独使用,也可以和其他选项一起使用。
WC_COMPOSITECHECK 把合成字符转换成预制的字符。它可以与后三个选项中的任何一个组合使用,如果没有与他们中的任何一个组合,则与选项WC_SEPCHARS相同。
WC_ERR_INVALID_CHARS 此选项会致使函数遇到无效字符时失败返回,并且GetLastError会返回错误码ERROR_NO_UNICODE_TRANSLATION。否则函数会自动丢弃非法字符。此选项只能用于UTF8。

WC_DISCARDNS 转换时丢弃不占空间的字符,与WC_COMPOSITECHECK一起使用
WC_SEPCHARS 转换时产生单独的字符,此是默认转换选项,与WC_COMPOSITECHECK一起使用
WC_DEFAULTCHAR 转换时使用默认字符代替例外的字符,(最常见的如’?’),与WC_COMPOSITECHECK一起使用。

当指定WC_COMPOSITECHECK时,函数会将合成字符转换成预制字符。合成字符由一个基字符和一个不占空间的字符(如欧洲国家及汉语拼音的音标)组成,每一个都有不同的字符值。预制字符有一个用于表示基字符和不占空间字符的合成体的单一的字符值。
当指定WC_COMPOSITECHECK选项时,也可以使用上表列出的最后3个选项来定制预制字符的转换规则。这些选项决定了函数在遇到宽字符串的合成字符没有对应的预制字符时的行为,他们与WC_COMPOSITECHECK一起使用,如果都没有指定,函数默认WC_SEPCHARS。

对于下列代码页,dwFlags必须为0,否则函数返回错误码ERROR_INVALID_FLAGS。
50220 50221 50222 50225 50227 50229 52936 54936 57002到57011 65000(UTF7) 42(Symbol)
对于UTF8,dwFlags必须为0或WC_ERR_INVALID_CHARS,否则函数都将失败返回并设置错误码ERROR_INVALID_FLAGS,你可以调用GetLastError获得。

lpWideCharStr: 待转换的宽字符串。

cchWideChar: 待转换宽字符串的长度,-1表示转换到字符串结尾。

lpMultiByteStr: 接收转换后输出新串的缓冲区。

cbMultiByte: 输出缓冲区大小,如果为0,lpMultiByteStr将被忽略,函数将返回所需缓冲区大小而不使用lpMultiByteStr。

lpDefaultChar: 指向字符的指针, 在指定编码里找不到相应字符时使用此字符作为默认字符代替。 如果为NULL则使用系统默认字符。对于要求此参数为NULL的dwFlags而使用此参数,函数将失败返回并设置错误码ERROR_INVALID_PARAMETER。

lpUsedDefaultChar:开关变量的指针,用以表明是否使用过默认字符。对于要求此参数为NULL的dwFlags而使用此参数,函数将失败返回并设置错误码ERROR_INVALID_PARAMETER。lpDefaultChar和lpUsedDefaultChar都设为NULL,函数会更快一些。

返回值: 如果函数成功,且cbMultiByte非0,返回写入lpMultiByteStr的字节数(包括字符串结尾的null);cbMultiByte为0,则返回转换所需

字节数。函数失败,返回0。
注意:函数WideCharToMultiByte使用不当,会给影响程序的安全。调用此函数会很容易导致内存泄漏,因为lpWideCharStr指向的输入缓冲区大小是宽字符数,而lpMultiByteStr指向的输出缓冲区大小是字节数。为了避免内存泄漏,应确保为输出缓冲区指定合适的大小。我的方法是先使cbMultiByte为0调用WideCharToMultiByte一次以获得所需缓冲区大小,为缓冲区分配空间,然后再次调用WideCharToMultiByte填充缓冲区,详见下面的代码。另外,从Unicode UTF16向非Unicode字符集转换可能会导致数据丢失,因为该字符集可能无法找到表示特定Unicode数据的字符。

wchar_t* pwszUnicode = "Holle, word! 你好,中国! ";
int iSize;
char* pszMultiByte;

iSize = WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, NULL, 0, NULL, NULL);
pszMultiByte = (char*)malloc((iSize+1)/**sizeof(char)*/);
WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, pszMultiByte, iSize, NULL, NULL);

第二个是多字节字符到宽字符转换函数,函数原型如下:
> int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cbMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);

此函数把多字节字符串转换成宽字符串(Unicode),待转换的字符串并不一定是多字节的。

此函数的参数,返回值及注意事项参见上面函数WideCharToMultiByte的说明,这里只对dwFlags做简单解释。

dwFlags: 指定是否转换成预制字符或合成的宽字符,对控制字符是否使用像形文字,以及怎样处理无效字符。

MB_PRECOMPOSED 总是使用预制字符,即有单个预制字符时,就不会使用分解的基字符和不占空间字符。此为函数的默认选项,不能和MB_COMPOSITE合用
MB_COMPOSITE 总是使用分解字符,即总是使用基字符+不占空间字符的方式
MB_ERR_INVALID_CHARS 设置此选项,函数遇到非法字符就失败并返回错误码ERROR_NO_UNICODE_TRANSLATION,否则丢弃非法字符
MB_USEGLYPHCHARS 使用像形字符代替控制字符

对于下列代码页,dwFlags必须为0,否则函数返回错误码ERROR_INVALID_FLAGS。
50220 50221 50222 50225 50227 50229 52936 54936 57002到57011 65000(UTF7) 42(Symbol)
对于UTF8,dwFlags必须为0或MB_ERR_INVALID_CHARS,否则函数都将失败并返回错误码ERROR_INVALID_FLAGS。

以下函数我没用过,只简要说明之。

int GetTextCharset( HDC hdc );

此函数获取当前选进的设备描述表的字符集,等同于GetTextCharsetInfo(hdc, NULL, 0)。

返回值: 成功返回字符集标识,失败返回DEFAULT_CHARSET
参考技术A 声明:
#ifdef UNICODE
wchar_t* ANSIToUnicode( const char* str );
char* UnicodeToANSI( const wchar_t* str );
#else
char* ANSIToUnicode( const char* str );
char* UnicodeToANSI( const char* str );
#endif

定义:
#ifdef UNICODE
wchar_t* ANSIToUnicode( const char* str ) // 1. ANSI to Unicode

int len = 0;
len = strlen(str);
int unicodeLen = ::MultiByteToWideChar( CP_ACP,
0,
str,
-1,
NULL,
0 );
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar( CP_ACP,
0,
str,
-1,
(LPWSTR)pUnicode,
unicodeLen );
//rt = ( wchar_t* )pUnicode;
//delete pUnicode;

return pUnicode;

char* UnicodeToANSI( const wchar_t* str ) // 2. Unicode to ANSI

char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = WideCharToMultiByte( CP_ACP,
0,
str,
-1,
NULL,
0,
NULL,
NULL );
pElementText = new char[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
::WideCharToMultiByte( CP_ACP,
0,
str,
-1,
pElementText,
iTextLen,
NULL,
NULL );
//string strText;
//strText = pElementText;
//delete[] pElementText;
return pElementText;

#else
char* ANSIToUnicode( const char* str ) // 1. ANSI to Unicode

int len = 0;
len = strlen(str);
char *pUnicode;
pUnicode = new char[len+1];
memset(pUnicode,0,len+1);
strcpy_s(pUnicode,len+1,str);

return pUnicode;

char* UnicodeToANSI( const char* str )

int len = 0;
len = strlen(str);
char *pUnicode;
pUnicode = new char[len+1];
memset(pUnicode,0,len+1);
strcpy_s(pUnicode,len+1,str);

return pUnicode;

#endif

PS:随便写的,手头没工具,我没测试,你自己试,有错自己改吧
补充一下,你给的函数里申请内存用的new,
所以释放不能用free,要用delete,比如你给的例子:
TCHAR* psz = ANSIToUnicode(pBuf);
//SetDlgItemText(IDC_EDIT_RECV, psz);
//free(psz); 这里改成:
delete [] psz;本回答被提问者采纳
参考技术B char p[100]="s;lkdfjsldkjfls;d";
unsigned lenOfWideCharStr = ::MultiByteToWideChar(CP_ACP,0,p,-1,NULL,0); //include '\0'
TCHAR* pWideAddr = new wchar_t [lenOfWideCharStr];
::MultiByteToWideChar(CP_ACP,0,p,-1,pWideAddr,lenOfWideCharStr);
参考技术C _tcsncpy
_tcslen
相应的字符串用_T("...")
或TEXT("..") 打到代码里
另外,站长团上有产品团购,便宜有保证

在 Java 中,如何将 String 转换为 char 或将 char 转换为 String?

【中文标题】在 Java 中,如何将 String 转换为 char 或将 char 转换为 String?【英文标题】:In Java how does one turn a String into a char or a char into a String? 【发布时间】:2011-01-26 14:51:11 【问题描述】:

有没有办法将char 转换为StringString,其中一个字母转换为char(例如如何将int 转换为double 和@987654327 @ 变成 int)? (如果可以,请链接到相关文档)。

我如何才能找到我在文档中只是模糊地知道的类似内容?

【问题讨论】:

【参考方案1】:
char firstLetter = someString.charAt(0);
String oneLetter = String.valueOf(someChar);

您可以通过识别可能涉及的类来查找文档。在这里,候选人是java.lang.Stringjava.lang.Character

您应该首先熟悉:

java.lang 中的原始包装器 java.util 中的 Java 集合框架

它还有助于通过教程更慢地介绍 API。

Manipulating characters in a String

【讨论】:

查看相关的 javadoc 文档【参考方案2】:

String.valueOf('X') 将为您创建一个字符串"X"

"X".charAt(0) 会给你字符'X'

【讨论】:

【参考方案3】:

正如没有人提到的,另一种从单个字符创建字符串的方法:

String s = Character.toString('X');

返回一个表示指定字符的字符串对象。结果是 长度为 1 的字符串,仅由指定的字符组成。

【讨论】:

【参考方案4】:
String someString = "" + c;
char c = someString.charAt(0);

【讨论】:

"" + 'c' 使用自动装箱,不推荐使用,因为它先是 "" + Character.toString('c'),然后是 "" + "c",然后是 "c"。它会执行额外的"" + "c" 操作,如果使用太频繁会降低程序速度。【参考方案5】:
String g = "line";
//string to char
char c = g.charAt(0);
char[] c_arr = g.toCharArray();
//char to string
char[] charArray = 'a', 'b', 'c';
String str = String.valueOf(charArray);
//(or iterate the charArray and append each character to str -> str+=charArray[i])

//或 String s= new String(chararray);

【讨论】:

这不会向现有答案添加任何内容。 @Radiodef - 他们添加了toCharArray(),这正是我想要的。当时没有其他答案提到它。【参考方案6】:

为了将字符串转换为字符

 String str = "abcd";
char arr [] = new char[len]; // len is the length of the array
arr = str.toCharArray();

【讨论】:

你不必要地分配了一个长度为 'len' 的 char 数组,只是为了在下一行被覆盖【参考方案7】:

我喜欢做这样的事情:

String oneLetter = "" + someChar;

【讨论】:

我非常不喜欢它,因为它没有传达意图。你不想做任何加法或连接,所以+在这里不适合使用。

以上是关于【100分求解】 “char *”转换为“TCHAR * (提供所有代码 帮整理下 谢谢了 高手)的主要内容,如果未能解决你的问题,请参考以下文章

将 UIImage 数据转换为 const unsigned char myArry[100]

如何在 C# 中将固定字节/字符 [100] 转换为托管字符 []?

关于unsigned char 型数据转换成十进制或者16进制的问题

100分求解该sql语句的翻译

如何将浮点数转换为长度为 4 的字节数组(char* 数组)?

CCF 201409-3 字符串匹配 100分