<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 3094: &sect;[time.duration.io]p4 makes surprising claims about encoding</title>
<meta property="og:title" content="Issue 3094: &sect;[time.duration.io]p4 makes surprising claims about encoding">
<meta property="og:description" content="C++ library issue. Status: C++20">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue3094.html">
<meta property="og:type" content="website">
<meta property="og:image" content="http://cplusplus.github.io/LWG/images/cpp_logo.png">
<meta property="og:image:alt" content="C++ logo">
<style>
  p {text-align:justify}
  li {text-align:justify}
  pre code.backtick::before { content: "`" }
  pre code.backtick::after { content: "`" }
  blockquote.note
  {
    background-color:#E0E0E0;
    padding-left: 15px;
    padding-right: 15px;
    padding-top: 1px;
    padding-bottom: 1px;
  }
  ins {background-color:#A0FFA0}
  del {background-color:#FFA0A0}
  table.issues-index { border: 1px solid; border-collapse: collapse; }
  table.issues-index th { text-align: center; padding: 4px; border: 1px solid; }
  table.issues-index td { padding: 4px; border: 1px solid; }
  table.issues-index td:nth-child(1) { text-align: right; }
  table.issues-index td:nth-child(2) { text-align: left; }
  table.issues-index td:nth-child(3) { text-align: left; }
  table.issues-index td:nth-child(4) { text-align: left; }
  table.issues-index td:nth-child(5) { text-align: center; }
  table.issues-index td:nth-child(6) { text-align: center; }
  table.issues-index td:nth-child(7) { text-align: left; }
  table.issues-index td:nth-child(5) span.no-pr { color: red; }
  @media (prefers-color-scheme: dark) {
     html {
        color: #ddd;
        background-color: black;
     }
     ins {
        background-color: #225522
     }
     del {
        background-color: #662222
     }
     a {
        color: #6af
     }
     a:visited {
        color: #6af
     }
     blockquote.note
     {
        background-color: rgba(255, 255, 255, .10)
     }
  }
</style>
</head>
<body>
<hr>
<p><em>This page is a snapshot from the LWG issues list, see the <a href="lwg-active.html">Library Active Issues List</a> for more information and the meaning of <a href="lwg-active.html#C++20">C++20</a> status.</em></p>
<h3 id="3094"><a href="lwg-defects.html#3094">3094</a>. &sect;[time.duration.io]p4 makes surprising claims about encoding</h3>
<p><b>Section:</b> 30.5.11 <a href="https://wg21.link/time.duration.io">[time.duration.io]</a> <b>Status:</b> <a href="lwg-active.html#C++20">C++20</a>
 <b>Submitter:</b> Richard Smith <b>Opened:</b> 2018-04-02 <b>Last modified:</b> 2021-02-25</p>
<p><b>Priority: </b>0
</p>
<p><b>View all other</b> <a href="lwg-index.html#time.duration.io">issues</a> in [time.duration.io].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++20">C++20</a> status.</p>
<p><b>Discussion:</b></p>
<p>
[time.duration.io]p4 says:
</p>
<blockquote><p>
For streams where <code>charT</code> has an 8-bit representation, <code>"&micro;s"</code> should be encoded as UTF-8. Otherwise UTF-16 or 
UTF-32 is encouraged. The implementation may substitute other encodings, including <code>"us"</code>.
</p></blockquote>
<p>
This choice of encoding is not up to the <code>&lt;chrono&gt;</code> library to decide or encourage. The basic execution character 
set determines how a mu should be encoded in type <code>char</code>, for instance, and it would be truly bizarre to use a UTF-8 
encoding if that character set is, say, Latin-1 or EBCDIC.
<p/>
I suggest we strike at least the first two sentences of this paragraph, as the meaning of the prior wording is unambiguous 
without them and confusing with them, and they do not providing any normative requirements (although they do provide 
recommendations). The third sentence appears to have a normative impact, but it's hard to see how it's legitimate to call 
<code>"us"</code> an "encoding" of <code>"&micro;s"</code>; it's really just an alternative unit suffix. So how about replacing that 
paragraph with this:
</p>
<blockquote><p>
If <code>Period::type</code> is <code>micro</code>, but the character U+00B5 cannot be represented in the encoding used for 
<code>charT</code>, the unit suffix <code>"us"</code> is used instead of <code>"&micro;s"</code>.
</p></blockquote>
<p>
(This also removes the permission for an implementation to choose an arbitrary alternative "encoding", which seems undesirable.)
</p>

<p><i>[
2018-04-23 Moved to Tentatively Ready after 6 positive votes on c++std-lib.
]</i></p>


<p><i>[2018-06 Rapperswil: Adopted]</i></p>



<p id="res-3094"><b>Proposed resolution:</b></p>
<p>
This wording is relative to <a href="https://wg21.link/n4741">N4741</a>.
</p>

<ol>
<li>
<p>Edit 30.5.11 <a href="https://wg21.link/time.duration.io">[time.duration.io]</a> as indicated:</p>
<blockquote>
<pre>
template&lt;class charT, class traits, class Rep, class Period&gt;
  basic_ostream&lt;charT, traits&gt;&amp;
    operator&lt;&lt;(basic_ostream&lt;charT, traits&gt;&amp; os, const duration&lt;Rep, Period&gt;&amp; d);
</pre>
<blockquote>
<p>
-1- <i>Requires:</i> [&hellip;]
<p/>
-2- <i>Effects:</i> [&hellip;]
<p/>
-3- The units suffix depends on the type <code>Period::type</code> as follows:
</p>
<ol style="list-style-type: none">
<li><p>[&hellip;]</p></li>
<li><p>(3.5) &mdash; Otherwise, if <code>Period::type</code> is <code>micro</code>, the suffix is <code>"&micro;s"</code> 
(<code>"\u00b5\u0073"</code>).</p></li>
<li><p>[&hellip;]</p></li>
<li><p>(3.21) &mdash; Otherwise, the suffix is <code>"[<i>num</i>/<i>den</i>]s"</code>.</p></li>
</ol>
<p>
[&hellip;]
<p/>
-4- <del>For streams where <code>charT</code> has an 8-bit representation, <code>"&micro;s"</code> should be encoded as UTF-8. 
Otherwise UTF-16 or UTF-32 is encouraged. The implementation may substitute other encodings, including 
<code>"us"</code></del><ins>If <code>Period::type</code> is <code>micro</code>, but the character U+00B5 cannot be represented 
in the encoding used for <code>charT</code>, the unit suffix <code>"us"</code> is used instead of <code>"&micro;s"</code></ins>.
<p/>
-5- <i>Returns:</i> <code>os</code>.
</p>
</blockquote>
</blockquote>
</li>
</ol>





</body>
</html>
