Unlike other JSX attributes (e.g. contentEditable), charSet remains unchanged in the HTML output produced by the ReactDOMServer's render methods, which results in a minor inconsistency.
// `charSet` remains unchanged, while the other camel-case
// attributes are lowercased
console.log(ReactDOMServer.renderToStaticMarkup(
<>
<meta charSet="utf-8"/>
<meta httpEquiv="refresh" content="3"/>
<div contentEditable/>
</>
));
Looks like adding ['charSet', 'charset'] to packages/react-dom/src/shared/DOMProperty.js could fix it.