- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有货币符号的字符串:
std::string currency = "€";
我已将其转换为无符号字符:
const unsigned char* buf = reinterpret_cast<unsigned const char*>(currency.data());
for(auto i = 0u; i < currency.length(); ++i)
{
std::cout << std::hex << static_cast<int>(buf[i]) << std::endl;
}
并根据this description我得到 UTF-8 字符表示:0xE2 0x82 0xAC。我使用 gcc/Linux。
1.是否是C++跨平台行为?
我有一个使用 windows-1252 编码的设备,其中欧元货币符号由 0x80 表示。
2.如何进行UTF-8到windows-1252的转换?是否有可能以比以下更通用/自动的方式:
unsigned char eurWindows1252;
if(currency == "€")
{
eurWindows1252 = 0x80;
}
最佳答案
要正确使用 Unicode,您需要始终了解字符串的编码。下面的这段代码没有指定编码,所以如果你想要可移植的代码,这是一个糟糕的起点:
std::string currency = "€";
对于 C++11,最简单的解决方案是使用编码前缀,例如对于 UTF-8,我们有:
std::string currency = u8"€";
现在,您的字符串在所有平台上始终有效地编码为 UTF-8,并且通过访问字符串中的各个字符,您可以获得各个 UTF-8 字节。
如果您没有 c++11,那么您可能会使用宽字符串:
std::wstring currency = L"€";
然后使用 Unicode 特定库(ICU、ICONV、Qt、MultiByteToWideChar 等)将您的字符串转换为 UTF-8。
就个人而言,如果您想编写跨平台代码,我会坚持使用 C++11,并在内部对所有字符串使用 std::string 和 UTF-8 编码以及 u8"..."。这要容易得多。
现在关于将 UTF-8 字符串转换为 Windows-1252。当然,如果您只需要转换 € 和其他一些 UTF-8 字符,那么您可以通过字符串比较自行完成。但是,如果所需的功能(或要转换的字符串列表)增长,那么最好使用已经提到的库之一。并且选择很大程度上受您要在其上运行代码的平台的影响。
Unicode 世界包含超过 100,000 个字符。例如,存在许多字符“C”的变体。你想忽略所有这些(例如将它们转换为问号)并只考虑普通的旧“C”和“c”吗?或者您可能还想将“Ć”转换为“C”,以便您的转换提供更多兼容性?
你可能想看看这些问题: Portable and simple unicode string library for C/C++?和 How well is Unicode supported in C++11?
关于c++ - 如何将 utf 字符转换为 windows-1252?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55407820/
我是一名优秀的程序员,十分优秀!