gpt4 book ai didi

c++ - 如何在 C++ 中将 unicode 字符转换为大写

转载 作者:搜寻专家 更新时间:2023-10-31 02:14:45 25 4
gpt4 key购买 nike

我正在学习 C++ 中的 unicode,但我很难让它正常工作。我尝试将单个字符视为 uint64_t。如果我只需要打印出字符,它就可以工作,但问题是我需要将它们转换为大写。我可以将大写字母存储在一个数组中,并简单地使用与小写字母相同的索引,但我正在寻找更优雅的解决方案。我发现这个类似 question但是大多数答案都使用宽字符,这不是我可以使用的。这是我尝试过的:

#include <iostream>
#include <locale>
#include <string>
#include <cstdint>
#include <algorithm>

// hacky solution to store a multibyte character in a uint64_t
#define E(c) ((((uint64_t) 0 | (uint32_t) c[0]) << 32) | (uint32_t) c[1])

typedef std::string::value_type char_t;
char_t upcase(char_t ch) {
return std::use_facet<std::ctype<char_t>>(std::locale()).toupper(ch);
}

std::string toupper(const std::string &src) {
std::string result;
std::transform(src.begin(), src.end(), std::back_inserter(result), upcase);
return result;
}

const uint64_t VOWS_EXTRA[]
{
E("å") , E("ä"), E("ö"), E("ij"), E("ø"), E("æ")
};

int main(void) {
char name[5];
std::locale::global(std::locale("sv_SE.UTF8"));
name[0] = (VOWS_EXTRA[3] >> 32) & ~((uint32_t)0);
name[1] = VOWS_EXTRA[3] & ~((uint32_t)0);
name[2] = '\0';
std::cout << toupper(name) << std::endl;
}

我希望这会打印出字符 IJ 但实际上它会打印出与开头相同的字符 (ij)。


(编辑:好的,所以我阅读了更多关于标准 C++ 中的 unicode 支持的信息 here 。看来我最好的选择是使用 ICU 或 Boost.locale 之类的东西来完成这项任务。 C++ 本质上将 std::string 视为二进制数据的 blob,因此正确地大写 unicode 字母似乎不是一件容易的事。我认为我使用 uint64_t 的 hacky 解决方案在任何方面都不比 C++ 标准库更有用如果不是更糟的话。如果能举个例子说明如何使用 ICU 实现上述行为,我将不胜感激。)

最佳答案

看看 ICU User Guide .对于简单(单字符)大小写映射,您可以使用 u_toupper .对于完整案例映射,请使用 u_strToUpper .示例代码:

#include <unicode/uchar.h>
#include <unicode/ustdio.h>
#include <unicode/ustring.h>

int main() {
UChar32 upper = u_toupper(U'ij');
u_printf("%lC\n", upper);

UChar src = u'ß';
UChar dest[3];
UErrorCode err = U_ZERO_ERROR;
u_strToUpper(dest, 3, &src, 1, NULL, &err);
u_printf("%S\n", dest);

return 0;
}

关于c++ - 如何在 C++ 中将 unicode 字符转换为大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39560894/

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