如何解决有什么简单的方法可以用CString中的空格替换%20?
我需要用空格替换%20并得到我不理解的编译错误:
CString str = _T("foo%20bar");
str.Replace('%20',' '); // C4305 argument: truncation from 'int' to 'wchar_t'
str.Replace(_T('%20'),_T(' ')); // C4305 argument: truncation from 'int' to 'wchar_t'
str.Replace(_T("%20"),_T(" ")); // C2664 'int ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>::Replace(const wchar_t *,const wchar_t *)': cannot convert argument 1 from 'const char [4]' to 'wchar_t'
怎么了?
解决方法
CString::Replace()
方法将以空终止的字符串指针(而不是单个字符)作为输入。您的字符串文字需要使用"
而不是'
,例如:
CString str = _T("foo%20bar");
str.Replace(_T("%20"),_T(" "));
请注意,与您上一个示例匹配,您说的也是错误的。出现错误消息的唯一失败方法是,如果您的项目配置错误,其中UNICODE
定义为 1 ,而_UNICODE
未定义 2 。
1:如CString
被映射到CStringT<wchar_t>
所示。
2:如编译器所言,_T("%20")
是const char[]
而不是const wchar_t[]
。
CString
使用Win32 API中的TCHAR
,而不使用C运行时库中的_TCHAR
。 通常它们是可互换的,但在您所处的情况下不是这样。因此,您需要修复项目的配置以便也定义_UNICODE
,或者使用Win32 TEXT()
宏来匹配CString
对TCHAR
的使用:
CString str = TEXT("foo%20bar");
str.Replace(TEXT("%20"),TEXT(" "));
或者,完全停止使用基于TCHAR
的API(TCHAR
可以追溯到Win9x / ME的时代,当时Microsoft促使所有人开始将其代码迁移到Unicode),实际上不应该如果可以避免的话,可用于现代编码中。只需直接使用wchar_t
字符串即可,例如:
CStringW str = L"foo%20bar";
str.Replace(L"%20",L" ");
,
最后一个应该已经工作了,只是您似乎在项目中有一个宽的CString,而没有定义UNICODE
和/或_UNICODE
宏。
在这种组合中,_T()
宏没有为您提供兼容的字符串文字。但是L"whatever"
会。
str.Replace(L"%20",L" ");
请注意,此操作符合您的要求,但不足以进行URL转义。您应该转换所有%xx
序列。
%20
可以像%d
这样格式化字符串。和Replace
函数返回已替换的字符串,并且未替换str。
- 尝试:
str = str.Replace(_T("%%20"),_T(" "));
或 - 尝试:
str = str.Replace(_T("%20"),_T(" "));
其他信息
如果您看这篇Format specification syntax: printf
and wprintf
functions文章,将会看到以下澄清:
基本转换规范仅包含百分号和类型字符。例如,
%s
指定字符串转换。 要打印百分号字符,请使用%%
。 ...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。