怎么把utf字符转换成windows-1252?

时间:2019-03-28 22:32:10

标签: c++ utf-8 utf windows-1252

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

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;
}

1 个答案:

答案 0 :(得分:1)

要正确使用Unicode,您需要始终知道字符串的编码。 下面的代码未指定编码,因此,如果要使用可移植的代码,这是一个不好的起点:

  

std :: string currency =“€”;

对于C ++ 11,最简单的解决方案是使用编码前缀,例如对于UTF-8,我们有:

  

std :: string货币= u8“€”;

现在,在所有平台上,您的字符串都始终有效地编码为UTF-8,通过访问字符串中的单个字符,您可以获得单个UTF-8字节。

如果您没有c ++ 11,则可能会使用宽字符串:

  

std :: wstring货币= 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?