小编aat*_*two的帖子

time_t加速日期转换,给出错误的结果

我收集了一些要转换为增强(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)

我在这里做错什么了吗?

c++ boost

5
推荐指数
1
解决办法
159
查看次数

将utf16宽std :: wstring转换为utf8窄std :: string以获得稀有字符时的问题

为什么使用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还将两个文件视为相同。

最后我很想知道以下几点:

  1. 在上面的示例中,看起来错误的转换后的十六进制值如何正确映射到正确的utf8字符
  2. 为什么转换功能会将某些字符转换为这种形式,而几乎所有其他字符都产生预期的原始字节
  3. 另外,我想知道是否可以修改转换函数以阻止它以这种形式输出这些稀有字符

我应该注意,我下面已经有一个变通方法,该函数使用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)

c++ string unicode utf-8 character-encoding

1
推荐指数
1
解决办法
61
查看次数

标签 统计

c++ ×2

boost ×1

character-encoding ×1

string ×1

unicode ×1

utf-8 ×1