如何将 utf 字符转换为 windows-1252?
How to convert utf character to 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;
}
根据这个描述,我得到了 UTF-8 字符表示:0xE2 0x82 0xAC。我使用 gcc/Linux。
1.Is C++跨平台行为?
我有一个使用 windows-1252 编码的设备,其中欧元货币符号由 0x80 表示。
2.如何执行从UTF-8到Windows-1252的转换?是否可以以比以下更通用/自动的方式:
unsigned char eurWindows1252;
if(currency == "€")
{
eurWindows1252 = 0x80;
}
要正确使用 Unicode,您需要始终了解字符串的编码。 下面的代码没有指定编码,所以如果你想要可移植的代码,这是一个糟糕的起点:
std::字符串货币 = "€";
对于 C++11,最简单的解决方案是使用编码前缀,例如对于 UTF-8,我们有:
标准::字符串货币 = U8"€";
现在,您的字符串在所有平台上都有效地始终编码为 UTF-8,通过访问字符串中的单个字符,您可以获得单独的 UTF-8 字节。
如果你没有 c++11,那么你可能会使用宽字符串:
标准::字符串货币 = 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",以便您的转换提供更多兼容性?
您可能想看看这些问题: 用于 C/C++ 的可移植且简单的 unicode 字符串库?和 C++11 对 Unicode 的支持程度如何?
- 将 LPHMIXER 转换为 Windows mmeapi 中的 HMIXER
- 将 Genteruse 从 Linux 转换为 Windows
- 绕过 Windows 中的 __declspec(dllimport) 到 Linux 项目的转换
- 如何将Windows产品类型转换为名称?
- 将通用Windows应用程序转换为VisualStudio 2019上的常规应用程序
- 将位图 (bmp) 转换为具有透明度的 png (Windows c++)
- 将带斜杠的 Unix 路径转换为 Windows 路径
- 如何在Windows上将Qt QString转换为LPCTSTR
- 如何将Windows GUID转换为boost::uuid?
- 在C Windows程序中获取A/D转换器示例程序
- 如何将 UTF8 字符数组转换为 Windows 1252 字符数组
- CPP Windows 字符串转换混淆了 CStringA 和 LPCWSTR
- 如何将CString转换为使用WCHAR的Windows API和自定义函数?
- CPP-将源代码从Windows转换为Linux
- 将Windows SYSTEMTIME转换为字符串或字符buf,C++与用户的"Region and Language"格式?
- 如何将 utf 字符转换为 windows-1252?
- 将windows BITMAP转换为PIX(无符号字符缓冲区)
- 如何利用windows API将c++代码从windows自动转换为linux
- 如何在c++中将Windows日期转换为Unix时间
- 在 Unix/Linux 中将 Windows Filetime 转换为秒