gpt4 book ai didi

c++ - 将一种字符类型转换为另一种字符类型

转载 作者:行者123 更新时间:2023-11-28 00:14:04 25 4
gpt4 key购买 nike

我正在创建一个将字符更改为小写/大写的函数。但是,我使用模板允许使用任何字符类型 (char/wchar/char16_t/char32_t)。

我的问题是如何将 wchar_t/char16_t/char32_t 转换为 char,以便它可以被 std::islower(...) 检查和转换使用,并且std::tolower(...) 和等价的大写函数,然后将它们改回原来的 char 类型。

template<typename CharT>
CharT* UpperCase(CharT* str) {
CharT* out;

//Conversion goes here

for(Uint i = 0; i < std::char_traits<CharT>::length(str); i++)
std::strcat(string, str[i]);

//Conversion goes here

return out;
}

最佳答案

std::islower()std::tolower() 对以当前语言环境表示的 char 数据进行操作。还有 std::iswlower()std::towlower() 函数可用于对 wchar_t 数据进行操作(请注意它们但是不支持 UTF-16 代理)。

您必须将输入字符串转换为 wchar_t 或本地化的 char,根据需要进行小写比较/转换,然后将结果转换回原始字符串完成后编码。

请记住:

  • 与本地化 char 的转换对于非 ASCII 字符可能有损,具体取决于语言环境。

  • char之间的转换(仅限 UTF-7/8)<-> wchar_t(UTF-16 或 UTF-32,取决于平台)<-> char16_t (UTF-16) <-> char32_t (UTF-32) 是无损的,因为所有 UTF 都代表整个 Unicode 指令集,并且专门为它们之间的无损转换而设计.

因此,为了尽量减少数据丢失,我建议使用 std::iswlower()/std::towlower(),然后创建一些额外的模板来帮助您使用适当的转换从 CharT <-> wchar_t 转换您的字符串。您可以为 char(仅限 UTF-8)/char16_t/char32_t 使用标准的独立于语言环境的 codecvt 类 < -> wchar_t 转换。对于 char <-> wchar_t 转换,其中 char 数据被本地化,您可以使用 std::mbtowc()/std::mbrtowc() 或区域设置相关的 codecvt 类。没有标准函数/类来处理 UTF-7,您必须手动实现它。

例如:

std::wstring toWString(const std::basic_string<char> &str)
{
// if output is UTF-8, use std::codecvt_utf8 or std::codecvt_utf8_utf16 instead...
std::wstring_convert<std::codecvt<wchar_t, char>> conv;
return conv.from_bytes(str);
}

std::basic_string<char> fromWString(const std::wstring &str)
{
// if output is UTF-8, use std::codecvt_utf8 or std::codecvt_utf8_utf16 instead...
std::wstring_convert<std::codecvt<wchar_t, char>> conv;
return conv.to_bytes(str);
}

std::wstring toWString(const std::basic_string<wchar_t> &str)
{
return str;
}

std::basic_string<wchar_t> fromWString(const std::wstring &str)
{
return str;
}

std::wstring toWString(const std::basic_string<char16_t> &str)
{
std::wstring_convert<std::codecvt_utf16<char16_t>> conv;
const char16_t *ptr = str.c_str();
return conv.from_bytes( reinterpret_cast<const char*>(ptr), reinterpret_cast<const char*>(ptr + str.length()) );
}

std::basic_string<char16_t> fromWString(const std::wstring &str)
{
std::wstring_convert<std::codecvt_utf16<char16_t>> conv;
std::string tmp = conv.to_bytes(str);
return std::u16string( reinterpret_cast<const char16_t*>(tmp.c_str()), tmp.length() * sizeof(char16_t) );
}

std::wstring toWString(const std::basic_string<char32_t> &str)
{
std::wstring_convert<std::codecvt_utf16<char32_t>> conv;
const char32_t *ptr = str.c_str();
return conv.from_bytes( reinterpret_cast<const char*>(ptr), reinterpret_cast<const char*>(ptr + str.length()) );
}

std::basic_string<char32_t> fromWString(const std::wstring &str)
{
std::wstring_convert<std::codecvt_utf16<char32_t>> conv;
std::string tmp = conv.to_bytes(str);
return std::u32string( reinterpret_cast<const char32_t*>(tmp.c_str()), tmp.length() * sizeof(char32_t) );
}

template<typename CharT>
std::basic_string<CharT> UpperCase(const std::basic_string<CharT> &str)
{
std::wstring tmp = toWString(str);
std::transform(tmp.begin(), tmp.end(), tmp.begin(), std::towlower);
return fromWString(tmp);
}

关于c++ - 将一种字符类型转换为另一种字符类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31461275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com