如何将utf字符转换为windows-1252?

问题描述 投票:1回答:1

我有一个带有货币符号的字符串:

std::string currency = "€";

我已将其转换为unsigned chars:

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;
}
c++ utf-8 utf windows-1252
1个回答
1
投票

要正确使用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?

© www.soinside.com 2019 - 2024. All rights reserved.