2013-07-18 24 views
1

我在转换为小写字母的Unicode字符在VC + + MFC中的问题。我有一个CString Variable.so中的Unicode字符,与英语MakeLower()工作正常,我得到更低但它不能将unicode字符转换为小写字母。我尝试过STL算法转换:如何使小写字母的Unicode字符

std :: string data =“ИИИЛЛЛЛ”; // bulgerian chars

std :: transform(data.begin(),data.end(),data.begin(),:: tolower);

但它无法加载unicode字符,我得到“????”符号代替unicode字符。

你可以请让我知道是否有一个解决方案的unicode字符。我不喜欢使用boost库。提前感谢!

+0

'std :: tolower'是字符,不是字节型的,因此不能在非ANSII字符串上执行操作。在这种情况下,你应该考虑使用'boost :: locale'。 – nijansen

+1

@nijansen:他使用C调用':: tolower',而不是C++'std :: tolower '。 – MSalters

+0

@MSalters你是对的,我的坏。 – nijansen

回答

3

如果您的项目使用Unicode字符集(项目属性),CString::MakeLower()应该工作 - 注意,这将不转换字符串 的内容,它返回一个新的字符串,见this MSDN article

CString s1(_T("ABC")), s2; 
s2 = s1.MakeLower(); 
ASSERT(s2 == _T("abc")); 

EDIT:CString的:: MakeLower()不改变字符串的contentrs,它也返回到转换后的字符串

+0

感谢您的回复,是的我的项目属性设置为“使用Unicode字符集”。所以,我不认为MakeLower()将与Unicode字符一起工作。 – Basawaraj

+0

它确实适合我! (当项目设置为使用Unicode字符集时,CString应指向支持Unicode的CStringW) - 请参阅[MSDN文章](http://msdn.microsoft.com/zh-cn/library/vstudio/ms174288 .aspx),它说'一个CString对象支持char类型或wchar_t类型。它支持哪一个取决于哪一个符号,MBCS或UNICODE,在编译时定义的? –

+0

好的,谢谢。找到解决方法。调用CString :: MakeLower()之前的setlocale函数,用于uniocde小写转换。如果我将属性设置为MBCS,它可能会工作。谢谢 – Basawaraj

0

参考尝试

std::wstring data = L"ИИИЛЛЛЛ"; // Wide chars 

std::transform(data.begin(), data.end(), data.begin(), std::tolower<wchar_t>); 
+0

嗨MSalters感谢现在我能够加载Unicode字符,但即使算法无法转换为小写字母集Unicode字符集 – Basawaraj

+1

谢谢大家! 我找到了解决方案,我们需要在调用算法之前先设置Locale;现在可以正常工作:) :: setlocale(LC_ALL,“”); std :: wstring data = L“ИЗПИТВАНЕ”; //宽字符 std :: transform(data.begin(),data.end(),data.begin(),:: towlower); 非常感谢你MSalters :) – Basawaraj

+0

很好的补充,我还发现,只是调用setlocale()甚至修复CString :: MakeLower()与Unicode字符一起工作,无需去STL algorithm.Now MakeLower ()也适用于Unicode字符。 – Basawaraj

相关问题