我收集了一些要转换为增强(1.65.1)日期的unix时间戳,但是当它们将来距离太远时,转换似乎会中断。2040年及以后的一切似乎都在以某种方式回溯到1900年以后。
给定以下代码...
{
std::time_t t = 1558220400;
boost::gregorian::date date = boost::posix_time::from_time_t(t).date();
std::cout << "Date: " << date << std::endl;
}
{
std::time_t t = 2145500000;
boost::gregorian::date date = boost::posix_time::from_time_t(t).date();
std::cout << "Date: " << date << std::endl;
}
{
std::time_t t = 2500000000;
boost::gregorian::date date = boost::posix_time::from_time_t(t).date();
std::cout << "Date: " << date << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
...我得到以下输出...
Date: 2019-May-18
Date: 2037-Dec-27
Date: 1913-Feb-13
Run Code Online (Sandbox Code Playgroud)
...但是我期待以下输出...
Expected output:
Date: 2019-May-18
Date: 2037-Dec-27
Date: 2049-Mar-22
Run Code Online (Sandbox Code Playgroud)
我在这里做错什么了吗?
为什么使用utf16编码的宽字符串转换为utf8编码的窄字符串时,会转换为使用此常见转换函数转换时似乎不正确的十六进制值?
std::string convert_string(const std::wstring& str)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
return conv.to_bytes(str);
}
Run Code Online (Sandbox Code Playgroud)
你好。我在Windows上有一个C ++应用,该应用在命令行上需要一些用户输入。我正在使用宽字符主入口点来获取输入为utf16字符串,并使用上述函数将其转换为utf8窄字符串。
该功能可以在网上的许多地方找到,并且几乎可以在所有情况下使用。但是,我发现了一些无法正常运行的示例。
例如,如果我输入emojii字符“”作为字符串文字(在我的utf8编码的cpp文件中)并将其写入磁盘,则文件(FILE-1)包含以下数据(这是此处指定的正确utf8十六进制值)https ://www.fileformat.info/info/unicode/char/1f922/index.htm):
0xF0 0x9F 0xA4 0xA2
Run Code Online (Sandbox Code Playgroud)
但是,如果我在命令行上将emojii传递给我的应用程序,并使用上面的转换函数将其转换为utf8字符串,然后将其写入磁盘,则文件(FILE-2)包含不同的原始字节:
0xED 0xA0 0xBE 0xED 0xB4 0xA2
Run Code Online (Sandbox Code Playgroud)
尽管第二个文件似乎表明如果您复制并粘贴十六进制值(至少在notepad ++中),则转换产生了错误的输出,但它产生了正确的emojii。WinMerge还将两个文件视为相同。
最后我很想知道以下几点:
我应该注意,我下面已经有一个变通方法,该函数使用WinAPI调用,但是仅使用标准库调用才是梦想:)
std::string convert_string(const std::wstring& wstr)
{
if(wstr.empty())
return std::string();
int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
std::string strTo(size_needed, 0);
WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
return strTo;
}
Run Code Online (Sandbox Code Playgroud)