我有一个带有货币符号的字符串:
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;
}
答案 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?