如何检查包含utf8文本的std :: string是否以Windows中的大写字母开头?

时间:2018-02-20 09:45:34

标签: c++ windows

作为一名Windows程序员,我是一个完全的新手,并且很难用他们所有奇怪的自定义类型阅读Microsoft的文档。

据我所知,我需要使用IsCharUpper,但我无法找到任何文档告诉我如何使用std::string(包含utf8文本)并获取TCHAR代表std::string的第一个字符。

std::string是utf8并且标准化其他内容不是一种选择。仅支持某些脚本也不是一种选择。

2 个答案:

答案 0 :(得分:2)

TCHAR是Windows API中的别名,它将代表CHAR或WCHAR,具体取决于您是否构建了Unicode应用程序。

MultiByteToWideChar是您正在寻找的API,它将采用您的utf8输入字符串并填写WCHAR数组。如果您的应用程序是为Unicode构建的,则可以将WCHAR直接传递给IsCharUpper。如果没有,您可以致电IsCharUpperW,无论构建配置如何,都会WCHAR

这样的事情:

WCHAR out[2]={0};
int written = MultiByteToWideChar( 
  CP_UTF8, // Your input string is UTF8.
  0, // no flags apply
  your_string.c_str(), // the std::string you want to test
  your_string.length(), // can't pass 1 as the characters are variable size
  out, // Put the character here.
  1 // we want 1 character converted.
);
bool isUpper = false;
if(written == 1)
  isUpper = IsCharUpper(out[0]);

这是我的记忆,当给定一个确切数量的字符时,这个函数不需要写出零终止符,所以这应该有效。

答案 1 :(得分:2)

你可以试试这样的事情

#include <locale>
#include <codecvt>


bool isUpper(const std::string& utf8Str)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
    return IsUpperCase(myconv.from_bytes(utf8Str)[0]);
}