首页 > 解决方案 > 有什么简单的方法可以用 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'        

怎么了?

标签: stringmfc

解决方案


CString::Replace()方法将空终止的字符串指针作为输入,而不是单个字符。您的字符串文字需要使用,"而不是',例如:

CString str = _T("foo%20bar");
str.Replace(_T("%20"), _T(" "));

请注意,这与您的最后一个示例相匹配,您说这也是错误的。唯一可能因您显示的错误消息而失败的方法是,如果您的项目中有错误配置,其中UNICODE定义了1_UNICODE未定义2

1:通过CString映射到CStringT<wchar_t>.

2:正如编译器所说的那样明显_T("%20")是 aconst char[]而不是 a const wchar_t[]

CString使用TCHAR来自 Win32 API,而不是_TCHAR来自 C 运行时库。 通常它们是可以互换的,但在您的情况下并非如此。因此,您需要修复项目的配置,以便_UNICODE也定义它,或者使用 Win32TEXT()宏来匹配CString的使用TCHAR

CString str = TEXT("foo%20bar");
str.Replace(TEXT("%20"), TEXT(" "));

或者,干脆完全停止使用TCHAR基于 -based 的 API(TCHAR可以追溯到 Win9x/ME 时代,当时微软正在推动每个人开始将他们的代码迁移到 Unicode),如果可以避免的话,真的不应该在现代编码中使用它。只需wchar_t直接使用字符串,例如:

CStringW str = L"foo%20bar";
str.Replace(L"%20", L" ");

推荐阅读