【问题标题】:how to Make lower case letters for unicode characters如何为unicode字符制作小写字母
【发布时间】:2013-07-16 23:13:36
【问题描述】:

我在将 VC++ MFC 中的 unicode 字符转换为小写字母时遇到问题。我在 CString 变量中有 unicode 字符。所以,英语 MakeLower() 工作正常,我得到小写。但它无法将 unicode 字符转换为小写。我确实尝试了 STL 算法转换:

std::string data = "ИИИЛЛЛЛ"; //保加利亚字符

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

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

如果有针对 unicode 字符的解决方案,请告诉我。我不喜欢使用 boost 库。提前致谢!

【问题讨论】:

  • std::tolower 是字符,不是基于字节的,因此无法对非 ANSII 字符串执行操作。在这种情况下,你真的应该考虑使用boost::locale
  • @nijansen:他使用的是 C 调用 ::tolower,而不是 C++ std::tolower<char>
  • @MSalters 你是对的,我的错。

标签: c++ c visual-c++ mfc


【解决方案1】:

试试

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

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

【讨论】:

  • 嗨 MSalters,谢谢现在我能够加载 unicode 字符,但即使是算法也无法转换为 unicode 字符集的小写
  • 谢谢大家!我找到了解决方案,我们需要在调用算法之前先设置语言环境;现在工作正常:) ::setlocale(LC_ALL,""); std::wstring 数据 = L"ИЗПИТВАНЕ"; // 宽字符 std::transform(data.begin(), data.end(), data.begin(), ::towlower);非常感谢 MSalters :)
  • 补充一下,我还发现只调用 setlocale() 甚至可以修复 CString::MakeLower() 以使用 Unicode 字符,无需使用 STL 算法。现在 MakeLower()也适用于 Unicode 字符。
  • @Basawaraj 此评论应该是公认的答案。也许您可以回答自己的问题,从而使解决方案更加明显。
【解决方案2】:

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

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

编辑:CString::MakeLower() 确实改变了字符串的内容,它还返回对转换后的字符串的引用

【讨论】:

  • 感谢您的回复,是的,我的项目属性设置为“使用 Unicode 字符集”。所以,我认为 MakeLower() 不适用于 Unicode 字符。
  • 它对我有用! (当项目设置为使用 Unicode 字符集时),CString 应该指向支持 Unicode 的 CStringW)——见MSDN Article,上面写着A CString object supports either the char type or the wchar_t type. Which one it supports depends on which one of the symbols, MBCS or UNICODE, is defined at compile time
  • 好的,谢谢。找到解决方案。在 CString::MakeLower() 之前调用 setlocale 可用于 uniocde 小写转换。是的,如果我将属性设置为 MBCS,它可能会起作用。谢谢跨度>
猜你喜欢
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 2010-10-30
  • 1970-01-01
  • 2015-08-07
  • 2020-08-24
  • 1970-01-01
相关资源
最近更新 更多